Tips

例1: ログファイルから「ERROR」を含む行を検索し、ただし「IGNORED_ERROR」は除外する

`grep`は、ファイルや標準入力から特定の文字列やパターンを検索する強力なコマンドラインツールです。単なる文字列検索だけでなく、正規表現を駆使したり、検索結果をフィルタリングしたりすることで、ログ解析やコードベースの探索を効率化できます。

grep

grepは、ファイルや標準入力から特定の文字列やパターンを検索する強力なコマンドラインツールです。単なる文字列検索だけでなく、正規表現を駆使したり、検索結果をフィルタリングしたりすることで、ログ解析やコードベースの探索を効率化できます。

grepで検索結果を効率的に絞り込むテクニック

grepは非常に多機能ですが、特に-vオプション(invert match)や-eオプション(multiple patterns)を組み合わせることで、より複雑な検索条件を設定し、必要な情報だけを抽出できます。

# 例1: ログファイルから「ERROR」を含む行を検索し、ただし「IGNORED_ERROR」は除外する
grep 'ERROR' access.log | grep -v 'IGNORED_ERROR'

# 例2: 複数のキーワード「TODO」または「FIXME」を含む行を、カレントディレクトリ以下で再帰的に検索する
grep -e 'TODO' -e 'FIXME' -r .

# 例3: 特定の拡張子を持つファイルの中から複数のパターンを検索し、特定のパターンを除外する
# (例: Goファイルから「fmt.Println」または「log.Fatal」を検索し、「test_utils.go」は除外)
find . -name "*.go" | xargs grep -e 'fmt.Println' -e 'log.Fatal' | grep -v 'test_utils.go'

# 例4: Perl互換正規表現を使って、より複雑なパターンで検索し、特定の行を除外する
# 数字の後に「ms」が続く行を探し、ただしその数字が0の場合は除く
grep -P '\d+ms' perf.log | grep -v '0ms'

注意点やおすすめポイント:

  • grep -vは、不要なノイズを取り除く際に非常に役立ちます。例えば、特定のテストコードやログレベルの低いメッセージを除外したい場合に有効です。
  • grep -eオプションを複数指定することで、OR条件で検索できます。正規表現を|でつなぐことも可能ですが、可読性やシェルでのエスケープの手間を考えると-eの方が便利な場合があります。
  • grep -r(再帰検索)と--include='*.log'--exclude='*.bak'などのオプションを組み合わせると、さらに検索対象ファイルを絞り込めます。
  • grep -P (Perl互換正規表現) を使うと、より高度な正規表現(後方参照、lookaroundsなど)が利用でき、複雑なパターンマッチングが可能になります。