【Linuxコマンド】grep コマンドの使い方とよく使うオプション

概要

 
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 パターン で複数の検索パターンを指定できるため、googlebotbingbot をまとめて除外しています。
最後に wc -l で行数をカウントすることで、Bot を除いた実アクセスのおおよその件数を把握できます。

 

・プロセス一覧から「httpd」が含まれる行だけを抽出し、grep 自身の行は除外する。

ps -ef | grep httpd | grep -v grep

ps -ef でプロセス一覧を表示し、grep httpdhttpd を含む行のみを抽出しています。
ただしこのままだと 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 エラーがどのくらい出ているかざっくり把握したいときなどに利用します。
より詳しい集計は awksortuniq -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 httpdss -ltnp | grep 443journalctl -u httpd | grep -i error など、
さまざまなコマンドの出力を grep で絞り込むことで、膨大なログの中から目的の情報だけにフォーカスできます。
 

・監視スクリプトやバッチ処理での条件判定
「ログに特定の文字列が含まれていたらアラートを出す」「エラーが 1 件でもあれば終了ステータスをエラーにする」など、
grep の終了ステータス(マッチしたら 0、マッチしなければ 1)を利用して、シェルスクリプト内の条件分岐にも使われます。
 

オプション

 

grep のオプションは数が多いため、ここでは用途ごとに 4 つのカテゴリに分けてまとめています。

正規表現の選択および解釈:

short optionlong optiondescription
-E--extended-regexpPATTERN を拡張正規表現 (ERE) とする
-F--fixed-stringsPATTERN を改行で区切られた固定文字列の組とする
-G--basic-regexpPATTERN を基本正規表現 (BRE) とする
-P--perl-regexpPATTERN を Perl 正規表現とする
-e--regexp=PATTERN一致処理に PATTERN を使用する
-f--file=FILEFILE から PATTERN を取得する
-i--ignore-case大文字と小文字を区別しない
-w--word-regexp強制的に単語全体で PATTERN の一致処理を行う
-x--line-regexp強制的に行全体で PATTERN の一致処理を行う
-z--null-dataデータの行末を改行ではなく NULL とする

その他:

short optionlong optiondescription
-s--no-messagesエラーメッセージを抑止する
-v--invert-matchPATTERN に一致しなかった行を出力する
-V--versiongrepのバージョンを出力する
--helpHELPを出力する

出力制御:

short optionlong optiondescription
-m--max-count=NUMNUM 回一致後に中断する
-b--byte-offset出力行と併せてバイトオフセットを表示する
-n--line-number出力行と併せて行番号を表示する
-H--with-filename一致するごとにファイル名を表示する
-h--no-filename出力の先頭にファイル名を付けない
-o--only-matchingPATTERN に一致した部分のみを表示する
-q--quiet,--silentPATTERN に一致したら、grepを抜ける
-a--textバイナリーファイルもテキストとしてgrepする
-l--files-with-matchesPATTERN に一致する行を含むファイル名だけを表示する
-d--directories=ACTION指定したディレクトリにACTIONの動作を行う
-R--dereference-recursiveディレクトリ配下を再帰的にgrepする
-c--countPATTERN に一致した行の行数を出力する

前後の表示に関する制御:

short optionlong optiondescription
-B--before-context=NUM一致した前の NUM 行を表示する
-A--after-context=NUM一致した後の NUM 行を表示する
-C--context=NUM一致した前後 NUM 行を表示する

 

正規表現の扱い(基本正規表現か拡張正規表現か)や、前後行の表示などは、grep の使い勝手に大きく影響します。
用途に応じてオプションを組み合わせて使いこなしていくのがおすすめです。

より詳しいオプションや正規表現の仕様については、Linux の
grep(1) マニュアルページ(英語)
もあわせて参照してください。

ブログランキングに参加しています。クリックして応援していただけると嬉しいです。


人気ブログランキング

ブログランキング・にほんブログ村へ
にほんブログ村