大量のログやソースコードの中から「あの文字列が書かれた行」をすばやく見つけたい——そんなときに欠かせないのが Linux の grep コマンドです。grep はファイルやコマンドの出力から、指定した文字列やパターンに一致する行だけを抜き出して表示します。サーバー運用や開発の現場で毎日のように使う基本コマンドです。この記事では、grep の基本の使い方から、大文字小文字の無視・行番号の表示・フォルダ内の再帰検索・前後の行も表示するオプション、パイプとの組み合わせまで、初心者の方にも分かるように解説します。
目次
grep の基本の使い方
grep は「検索したい文字列(パターン)」と「対象のファイル」を指定して使います。指定した文字列を含む行がそのまま表示されます。
# 書式: grep 検索パターン ファイル名
grep "error" app.log
# app.log の中で "error" を含む行がすべて表示される
検索パターンにスペースや記号が含まれる場合に備えて、パターンは " で囲む習慣を付けておくと安全です。複数のファイルを並べて指定することもでき、その場合はどのファイルの行かがファイル名付きで表示されます。
# 複数ファイルをまとめて検索
grep "error" app.log error.log
# 出力例:
# app.log:May 10 ... error: not found
# error.log:May 10 ... error: timeout
よく使うオプション
grep はオプションを付けることで、検索の仕方や表示を細かく変えられます。とくに使用頻度が高いものを表にまとめました。
| オプション | 意味 |
|---|---|
-i | 大文字・小文字を区別しない |
-n | 行番号を一緒に表示する |
-r | フォルダ内を再帰的に検索する |
-v | 一致しない行を表示する |
-c | 一致した行数を数える |
-l | 一致したファイル名だけを表示する |
-w | 単語として一致するものだけ |
-E | 拡張正規表現を使う |
大文字小文字を無視する -i / 行番号を出す -n
-i を付けると、大文字・小文字を区別せずに検索します。Error も ERROR も error もまとめて拾いたいときに便利です。-n を付けると、各行の先頭に行番号が表示され、ファイルのどこにあるかがすぐ分かります。
# 大文字小文字を無視して検索
grep -i "error" app.log
# 行番号付きで表示
grep -n "error" app.log
# 出力例: 42:May 10 ... error: not found
オプションはまとめて書けます。grep -in "error" app.log のように続けて指定すれば、大文字小文字を無視しつつ行番号も表示できます。
フォルダ内をまとめて検索する -r
-r(recursive=再帰的)を付けると、指定したフォルダの中のすべてのファイルを対象に検索します。「このプロジェクトのどこかに書かれている関数を探したい」といった場面でとても役立ちます。ファイル名のかわりに、検索したいフォルダ(. は現在のフォルダ)を指定します。
# 現在のフォルダ以下から "wp_enqueue_script" を探す
grep -r "wp_enqueue_script" .
# 行番号も付けて探す(よく使う組み合わせ)
grep -rn "wp_enqueue_script" ./wp-content/themes
該当箇所が多すぎるときは、-l を加えると一致したファイル名だけを一覧できます。「どのファイルに書かれているか」をまず把握したいときに便利です。
# 一致したファイルの名前だけを表示
grep -rl "TODO" ./src
一致しない行・件数を調べる -v / -c
-v は、指定した文字列を含まない行だけを表示します。「コメント行(# で始まる行)を除いて中身を見たい」といったときに役立ちます。-c は一致した行を表示するかわりに、件数(行数)を数えて返します。
# コメント行(# で始まる行)以外を表示
grep -v "^#" config.conf
# "error" が何行あるか数える
grep -c "error" app.log
# 出力例: 12
上の例の ^# は「行の先頭が #」を表す正規表現です。grep は検索パターンに正規表現を使えるため、単純な文字列だけでなく柔軟なパターンで検索できます。
パイプと組み合わせて使う
grep が真価を発揮するのは、パイプ(|)で他のコマンドの出力を絞り込むときです。あるコマンドの結果をそのまま grep に渡すと、必要な行だけを取り出せます。実行中のプロセスから特定のものを探す、といった使い方が典型例です。
# 実行中プロセスから nginx を含む行を探す
ps aux | grep "nginx"
# インストール済みパッケージから php を探す
dpkg -l | grep "php"
このようにファイル名を指定せず、パイプから受け取ったデータを検索できるのが grep の便利なところです。ls・cat・history など、さまざまなコマンドの出力と組み合わせられます。
前後の行も一緒に表示する
エラーの前後の状況を確認したいときは、一致した行の周辺も表示すると便利です。-A(After)は後ろ、-B(Before)は前、-C(Context)は前後の行を、指定した行数ぶん一緒に表示します。
grep -A 3 "error" app.log # 一致行とその後ろ3行
grep -B 2 "error" app.log # 一致行とその前2行
grep -C 2 "error" app.log # 一致行とその前後2行ずつ
思った行が出ない・出すぎるとき
余計な行まで一致してしまう
たとえば grep "log" とすると、log を含む login や catalog まで一致してしまいます。単語として一致させたいときは -w を付けます。これで前後が区切られた「単独の log」だけが対象になります。
記号を含むパターンで一致しない
grep はパターンを正規表現として解釈するため、. や *、( などの記号は特別な意味を持ちます。これらを文字そのものとして検索したいときは、-F(固定文字列として扱う)を使うか、記号の前に \ を付けてエスケープします。たとえば IP アドレスの 192.168.0.1 を正確に探すなら grep -F "192.168.0.1" が確実です。
OR 検索がうまくいかない
「error または warning」のように複数の語を検索したいときは、拡張正規表現の | を使います。このとき -E オプションを付けるのがポイントです。grep -E "error|warning" app.log と書けば、どちらかを含む行が表示されます。
# error または warning を含む行
grep -E "error|warning" app.log
まとめ
grep は、ファイルやコマンド出力から目的の行を抜き出す、Linux の基本にして強力なコマンドです。要点を整理します。
- 基本は
grep "パターン" ファイル名。一致する行が表示される。 -iで大文字小文字を無視、-nで行番号、-rでフォルダ内を再帰検索。-vで一致しない行、-cで件数、-lでファイル名だけを表示。- パイプ(
|)で他コマンドの出力を絞り込める(例:ps aux | grep)。 -A/-B/-Cで前後の行も表示。OR 検索は-E "a|b"。
まずは grep -rn "探したい文字列" . でプロジェクト内を検索するところから使い始めると、その便利さがすぐに実感できます。オプションを少しずつ覚えて、ログ調査やコード検索を効率化していきましょう。