1. ホーム
  2. Linux

【Linux】grep コマンドの使い方|文字列の検索とよく使うオプションを解説

Share

大量のログやソースコードの中から「あの文字列が書かれた行」をすばやく見つけたい——そんなときに欠かせないのが 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 を付けると、大文字・小文字を区別せずに検索します。ErrorERRORerror もまとめて拾いたいときに便利です。-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 の便利なところです。lscathistory など、さまざまなコマンドの出力と組み合わせられます。

前後の行も一緒に表示する

エラーの前後の状況を確認したいときは、一致した行の周辺も表示すると便利です。-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 を含む logincatalog まで一致してしまいます。単語として一致させたいときは -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 "探したい文字列" . でプロジェクト内を検索するところから使い始めると、その便利さがすぐに実感できます。オプションを少しずつ覚えて、ログ調査やコード検索を効率化していきましょう。

参考ページ