Linux の grep コマンド は、指定したファイル、または標準入力内から指定したパターンを検索するためのコマンドです。
検索には正規表現を使うこともでき、単純な文字列検索だけでなくパターンマッチングによる抽出が可能です。
Apache のアクセスログなどの各種ログや、プロセス一覧、設定ファイルの中身などを grep で検索することで、
必要な行だけを素早く見つけることができます。
他のコマンドとパイプ(|)で組み合わせてフィルタとして使うパターンが、実務では非常に多いです。
grep [オプション]... パターン [ファイル]...※ パターンはデフォルトでは基本正規表現(BRE)として解釈されます。
基本的な使い方は、次の 2 パターンです。
- ファイルを指定して、その中からパターンに一致する行を検索する
- 他のコマンドの出力をパイプで受け取り、その中から一致する行だけを抜き出す
正規表現の解釈方式は -E(拡張正規表現)や -F(固定文字列)などで切り替えることができます。
・messages から「error」を大文字小文字を区別せずに検索し、前後の行も合わせて出力する。
grep -i -B5 -A3 error /var/log/messages
-i は大文字小文字を区別せずに検索するオプションです。
-B5 は「マッチした行の5 行前(Before)」、-A3 は「3 行後(After)」もあわせて出力します。
エラー行の前後にどんなログが出ているかを確認したいときに非常に便利です。
・Apache の accesslog から「googlebot」と「bingbot」を除外した行数をカウントする。
grep -v -e googlebot -e bingbot ./accesslog | wc -l
-v は「パターンにマッチしない行を表示する」オプションです。
-e パターン で複数の検索パターンを指定できるため、googlebot と bingbot をまとめて除外しています。
最後に wc -l で行数をカウントすることで、Bot を除いた実アクセスのおおよその件数を把握できます。
・プロセス一覧から「httpd」が含まれる行だけを抽出し、grep 自身の行は除外する。
ps -ef | grep httpd | grep -v grep
ps -ef でプロセス一覧を表示し、grep httpd で httpd を含む行のみを抽出しています。
ただしこのままだと grep httpd 自身のプロセス行もヒットしてしまうため、
最後に grep -v grep で grep 行を除外しています。
最近は ps aux | grep [h]ttpd のような書き方で grep 行を避ける方法もよく使われます。
・Apache の accesslog から「.js」「.css」を含む行を除外し、tail の結果をリアルタイムでフィルタする。
tail -f ./accessslog | grep -v -e \.js -e \.css --line-buffered
tail -f でログをリアルタイムに追いかけ、その出力を grep でフィルタしています。
-v で除外、-e で複数パターン(ここでは \.js と \.css)を指定し、
–line-buffered によって行単位でバッファリングせずに出力しています。
静的ファイルへのアクセスを省いて、アプリケーションへのリクエストだけを追跡したいときに便利です。
・grep で再帰的に検索し、特定のファイル名・ディレクトリ名を除外して結果を表示する。
grep -rn hoge --exclude=*txt*
-r はディレクトリを再帰的にたどって検索するオプション、-n は行番号を表示します。
–exclude でファイル名パターンにマッチするもの(ここでは *txt*)を検索対象から外しています。
「検索したいが、特定のログや一時ファイルは除外したい」といったケースで役立ちます。
・ファイルを指定せず、標準入力からの出力をフィルタする基本形。
dmesg | grep -i error
カーネルメッセージ(dmesg)の出力をパイプで grep に渡し、
大文字小文字を区別せず error を含む行だけを抽出します。
このように、多くのコマンドと組み合わせて必要な行だけを見るフィルタとして使うのが grep の真骨頂です。
・行数だけ知りたい場合(ヒット件数をカウントする)。
grep -c "404" access.log
-c は「マッチした行数のみを表示」するオプションです。
404 エラーがどのくらい出ているかざっくり把握したいときなどに利用します。
より詳しい集計は awk や sort・uniq -c との組み合わせが便利です。
・コメント行を除外して設定ファイルの有効な行だけを確認する。
grep -v "^#" /etc/httpd/conf/httpd.conf
-v で「マッチしない行」を表示し、^# という正規表現で「行頭が # の行(コメント)」を指定しています。
コメント行を除いた、実際に有効な設定のみをざっと確認したいときに便利なパターンです。
・ログから必要な行だけを抽出するフィルタとして
Apache / Nginx の accesslog・errorlog、アプリケーションログ、システムログ(/var/log/messages など)に対して、
grep で特定の文字列やエラーコードを絞り込むのは、障害調査や性能トラブル対応で毎回のように登場するパターンです。
・設定ファイルやソースコードの検索
設定ファイルの中から特定ディレクティブを探したり、ソースコード一式の中から関数名やキーワードを検索したりといった用途でも、
grep -rn "keyword" ディレクトリ のような再帰検索が頼りになります。
・ps / netstat / ss / journalctl などの出力絞り込み
ps aux | grep httpd や ss -ltnp | grep 443、journalctl -u httpd | grep -i error など、
さまざまなコマンドの出力を grep で絞り込むことで、膨大なログの中から目的の情報だけにフォーカスできます。
・監視スクリプトやバッチ処理での条件判定
「ログに特定の文字列が含まれていたらアラートを出す」「エラーが 1 件でもあれば終了ステータスをエラーにする」など、
grep の終了ステータス(マッチしたら 0、マッチしなければ 1)を利用して、シェルスクリプト内の条件分岐にも使われます。
grep のオプションは数が多いため、ここでは用途ごとに 4 つのカテゴリに分けてまとめています。
正規表現の選択および解釈:
| short option | long option | description |
|---|---|---|
| -E | --extended-regexp | PATTERN を拡張正規表現 (ERE) とする |
| -F | --fixed-strings | PATTERN を改行で区切られた固定文字列の組とする |
| -G | --basic-regexp | PATTERN を基本正規表現 (BRE) とする |
| -P | --perl-regexp | PATTERN を Perl 正規表現とする |
| -e | --regexp=PATTERN | 一致処理に PATTERN を使用する |
| -f | --file=FILE | FILE から PATTERN を取得する |
| -i | --ignore-case | 大文字と小文字を区別しない |
| -w | --word-regexp | 強制的に単語全体で PATTERN の一致処理を行う |
| -x | --line-regexp | 強制的に行全体で PATTERN の一致処理を行う |
| -z | --null-data | データの行末を改行ではなく NULL とする |
その他:
| short option | long option | description |
|---|---|---|
| -s | --no-messages | エラーメッセージを抑止する |
| -v | --invert-match | PATTERN に一致しなかった行を出力する |
| -V | --version | grepのバージョンを出力する |
| --help | HELPを出力する |
出力制御:
| short option | long option | description |
|---|---|---|
| -m | --max-count=NUM | NUM 回一致後に中断する |
| -b | --byte-offset | 出力行と併せてバイトオフセットを表示する |
| -n | --line-number | 出力行と併せて行番号を表示する |
| -H | --with-filename | 一致するごとにファイル名を表示する |
| -h | --no-filename | 出力の先頭にファイル名を付けない |
| -o | --only-matching | PATTERN に一致した部分のみを表示する |
| -q | --quiet,--silent | PATTERN に一致したら、grepを抜ける |
| -a | --text | バイナリーファイルもテキストとしてgrepする |
| -l | --files-with-matches | PATTERN に一致する行を含むファイル名だけを表示する |
| -d | --directories=ACTION | 指定したディレクトリにACTIONの動作を行う |
| -R | --dereference-recursive | ディレクトリ配下を再帰的にgrepする |
| -c | --count | PATTERN に一致した行の行数を出力する |
前後の表示に関する制御:
| short option | long option | description |
|---|---|---|
| -B | --before-context=NUM | 一致した前の NUM 行を表示する |
| -A | --after-context=NUM | 一致した後の NUM 行を表示する |
| -C | --context=NUM | 一致した前後 NUM 行を表示する |
正規表現の扱い(基本正規表現か拡張正規表現か)や、前後行の表示などは、grep の使い勝手に大きく影響します。
用途に応じてオプションを組み合わせて使いこなしていくのがおすすめです。
より詳しいオプションや正規表現の仕様については、Linux の
grep(1) マニュアルページ(英語)
もあわせて参照してください。
新着情報
ブログランキングに参加しています。クリックして応援していただけると嬉しいです。
