はじめに
「数万行のログを目で追っていませんか?」
「急な障害調査、どこから手をつけていいか焦った経験はありませんか?」
「キーワードを探すのにプロジェクト全体を一つずつ開いていませんか?」
現場に入りたての頃、誰もが一度は経験するこんな「調査の泥沼」。実は、grepコマンドを少し深く知るだけで、その悩みから解放されます。
この記事では、grepのオプション紹介はもちろん、現場で本当に役立つ実践的な使い方、特に「正規表現」やfindなどの他コマンドとの「合わせ技」に焦点を当てて解説します。
この記事を読み終える頃には、あなたは面倒な調査作業をコマンド一発で終わらせる「検索の達人」になっているはず。
【基本編】よく使う便利オプション5選
- ただ文字列を検索するだけじゃない!
これだけは覚えておきたい、grepの基本にして最強のオプションを紹介します!
# -i: 大文字・小文字を無視して検索
$ grep -i "error" server.log
# -n: 該当行の行番号を表示
$ grep -n "Exception" app.log
# -A 3: 該当行の後の3行を表示
$ grep -A 3 "Exception" app.log
##該当行の前を取得したいなら -B
##該当行の前後を取得したいなら -C
# -v: 指定した文字列を含まない行を抽出
$ grep -v "DEBUG" system.log
# -r: ディレクトリ配下を再帰的に検索(超重要!)
$ grep -r "function_name" ./src
# -c: 該当する行数をカウント
$ grep -c "WARNING" access.log
# -a: バイナリファイルを対象にする場合
grep -a "hogehoge" aplocation.dat
【本題】正規表現でgrepの真価を引き出す
- grepの能力を100%引き出す鍵は「正規表現」です
- 難しく感じるかもしれませんが、実務で使うパターンは限られています。これだけ覚えればOKというものに絞って解説します
よく使う正規表現メタ文字
^: 行頭
$: 行末
.: 任意の一文字
*: 直前の文字の0回以上の繰り返し
[]: 角括弧内のいずれかの文字
実践的な活用例(Before/After)
やりたいこと: IPアドレス(っぽい文字列)をログから抽出したい。
Before
# これだと "127.0.0.1" しか見つからない...
$ grep "127.0.0.1" access.log
After
# egrep (or grep -E) を使って拡張正規表現で賢く検索
$ egrep "[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}" access.log
【実践編】他コマンドの合わせ技で調査効率を最大化
- grepコマンドは単体でも十分強力ですが、他のコマンドと組み合わせることでその真価を発揮します!
・find × grep: 特定のパターンのファイル(例:.log拡張子)の中からだけ高速に検索する
#カレントディレクトリ以下の.logファイルから"FATAL"を検索
find . -name "*.log" | xargs grep "FATAL"
・ パイプ | の活用: grepの結果をさらにgrepで絞り込む(grep -vと組み合わせると超強力)
# user_id: 123 のログから、"DEBUG"レベルのログは除外して表示
grep "user_id: 123" application.log | grep -v "DEBUG"
参考にさせていただいた記事