grep実践編|ログ調査とコード検索の絞り込みレシピ

grep実践編|ログ調査とコード検索の絞り込みレシピ

grep で目当ての行は見つけられるようになったけれど、そこから先で手が止まる——ログ調査をしていると、そんな場面によく出会います。

エラー行そのものより、直前に何が起きていたか・同じエラーが何回出ているかが知りたいことは多いはず。

この記事は基本編(grep入門)の次の一歩として、実務で使う絞り込みレシピを紹介します。

grep入門|ファイルから必要な行だけを検索・抽出する基本

複数ファイルをまたぐと区切り文字が変わる(-r × -A/-B)

複数ファイルを -r で検索し、そこに -A・-B を重ねる場面も実務では珍しくありません。

一致した行と前後の行が、同じ書式で並ぶわけではないという点は見落としやすいところです。

grep -rn -A 2 "TODO" ./src
# ./src/app.py:12:# TODO: refactor here
# ./src/app.py-13-def old_func():
# ./src/app.py-14-    pass
# --
# ./src/utils.py:40:# TODO: add validation
# ./src/utils.py-41-def validate(x):

一致行は「ファイル名:行番号:内容」、前後行は「ファイル名-行番号-内容」と、区切り文字そのものが変わる仕様になっています。

一致が連続しないところには -- が挟まることもあるので、覚えておくと戸惑いません。

区切り文字の違いを知っておけば、パイプで後続処理をするときも一致行と前後行を確実に見分けられます

一致部分を抜き出して数える(-o・-c)

障害対応で聞かれるのは「どこで出たか」だけでなく「何回出たか」です。

回数の集計は -c で行数を数える・-o で一致部分だけ抜き出す の2つでだいたい片づきます。

grep -c "ERROR" app.log           # 一致した行数
grep -o "ERROR\|WARN" app.log     # 一致部分だけを1行ずつ
grep -o "user=[0-9]*" app.log     # パターンの中身を取り出す

-c は「一致した行数」であって出現回数ではない点だけ、頭の片隅に置いておきたいところ。

1行に2回出ても1と数えられるので、出現回数を正確に数えたいときは -o の結果を行数で数えるのが確実です。

記号で事故らない(-F・-w)

IPアドレスやファイルパスを検索して、意図しない行まで一致してしまった経験はないでしょうか。

grep の検索語は正規表現として解釈されるため、. や $ はただの文字ではないのです。

grep "192.168.1.1" app.log     # . は「任意の1文字」扱い
grep -F "192.168.1.1" app.log  # 固定文字列として検索
grep -w "log" note.txt         # 単語として完全一致

-F を付ければ記号をそのまま検索できるので、IPアドレスや金額の検索はこれが安全です。

部分一致を避けたいときの -w も合わせて覚えておくと、logger や catalog が混ざる事故を防げます。

対象ファイルを絞る(–include・xargs)

プロジェクト全体を -r で検索すると、node_modules やビルド成果物まで引っかかって画面が流れてしまいがち。

–include は対象の指定・–exclude-dir は除外の指定で、これだけでノイズが激減します。

grep -rn --include="*.py" "TODO" .
grep -rn --exclude-dir=node_modules "TODO" .
find . -name "*.log" -mtime -1 | xargs grep -l "ERROR"

更新日などファイル側の条件で絞りたいときは find と xargs の併用が定石です。

昨日更新されたログだけを検索対象にする、といった芸当ができるようになります。

条件を組み合わせる(AND・OR・NOT)

実務の検索条件は、たいてい1語では済みません。

AND はパイプで grep を重ねる・OR は -E の | でつなぐ・NOT は -v——組み合わせはこの3つで表現できます。

grep "ERROR" app.log | grep "payment"         # AND
grep -E "ERROR|FATAL" app.log                 # OR
grep "ERROR" app.log | grep -v "known_issue"  # NOT

たとえば「今朝9時台の ERROR か FATAL を、既知の警告を除いて数える」も、単純な grep をパイプで3段つなぐだけで書けるのです。

grep "2026-07-28 09:" app.log | grep -E "ERROR|FATAL" | grep -vc "known_issue"

複雑な正規表現を1発で書こうとしないのがコツで、単純な grep を重ねたほうが読みやすく間違いも減ります。

最後に

基本編の4オプションに、今回の -A/-B・-o/-c・-F/-w・–include を足せば、日常の検索はほぼ困りません。

「見つける」から「絞り込んで数える」へ進むと、grep はログ調査の主戦力になってくれます

まずは手元のログで -B 3 あたりから試してみてください。

以上です。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA