【ぐれっぷ】

grep とは?

最終更新:
💡 文字列の条件を決めて、一致する行だけを取り出す

テキストからパターンに一致する行を表示するコマンド。固定文字列と正規表現、大文字・小文字、行番号、終了コードの違いを、再現できる小さな例で解説します。

📌 このページのポイント
grep:一致した行を取り出す架空の入力:server.log1INFO ready2ERROR connect3WARN slow4ERROR timeoutgrep -nF 'ERROR' server.log-n:行番号 / -F:固定文字列表示結果2:ERROR connect4:ERROR timeout既定では大小文字を区別。errorとは別
入力の左の番号は説明用で、元のテキストには含めません。固定文字列ERRORの検索結果であり、大小文字を区別しない検索には別の指定が必要です。
ひよこ ひよこ
ログのERROR行だけを見るには?
ペンギン先生 ペンギン先生
たとえばgrep -nF 'ERROR' server.logだよ。-Fは文字列をそのまま検索し、-nは行番号を付ける。図の架空ログなら、2行目と4行目が表示される。ファイル名がなければ標準入力も検索できるんだ。
ひよこ ひよこ
小文字のerrorでも一致する?
ペンギン先生 ペンギン先生
既定では大文字・小文字を区別するので、ERRORだけの行には一致しない。区別しないならgrep -i 'error' server.log。どちらを探したいかに合わせて指定しよう。
ひよこ ひよこ
正規表現とはどう違う?
ペンギン先生 ペンギン先生
通常の検索では、点などが特別な意味を持つ。grep 'a.b'はa.bだけでなくaxbにも一致するよ。点を含む文字列をそのまま探すならgrep -F 'a.b'にする。シェルに解釈させないため、検索パターンを引用符で囲もう。
ひよこ ひよこ
ERRORかWARNで始まる行なら?
ペンギン先生 ペンギン先生
grep -E '^(ERROR|WARN)' server.logと書けるよ。-Eは拡張正規表現、^は行頭、|は候補の選択だね。ディレクトリ以下を探すなら-rも使える。コマンドの出力をパイプで渡して検索することもできるよ。
ひよこ ひよこ
何も出ないときは、失敗したということ?
ペンギン先生 ペンギン先生
一致しなかった場合と、ファイルが読めないなどのエラーを分けよう。通常、GNU grepの終了コードは一致あり0、一致なし1、エラー2。自動処理では、1をすべて障害扱いにしないことが大事だよ。
もっと詳しく知りたい人へ

ハイフンで始まる文字を検索したいときは?

grep -F -- '-option' file.txtのように、--でオプション指定の終わりを示せます。-e '-option'でパターンを明示する方法もあります。引用符で囲むだけでは、オプションとの区別はできません。

ripgrep(rg)なら、同じファイルが全部検索される?

同じとは限りません。ripgrepは既定で再帰検索し、.gitignoreを尊重し、隠しファイルやバイナリファイルなどを除外します。見つからない理由を検索語だけで判断せず、対象ファイルの選び方も確認しましょう。速度も対象や条件で変わります。

終了コードの説明には例外もある?

GNU grepの-qでは、一致を見つけると、エラーがあっても0で終了する場合があります。また、別実装のgrepではエラーの終了コードが異なることがあります。自動処理に組み込む場合は、使っている実装とオプションのマニュアルを確認してください。

ペンギン
まとめ:ざっくりこれだけ覚えればOK!
「grep」って出てきたら「テキストから条件に一致する行を取り出すコマンド」と思えばだいたいOK!
📖 おまけ:英語の意味
「grep」 = パターンに一致する行を表示するコマンド名
💬 GNU grepのマニュアルでは、入力ファイルや標準入力からパターンに一致する行を探し、既定ではその行を表示するコマンドと説明されています。

参考資料

← 用語集にもどる