基本
grep "hoge" example.txt
ファイル「example.txt」から「hoge」が含まれる行を抽出する
検索ワードの前後何行かを抜き出したい時
grep -A 5 "hoge" example.txt
hogeが存在する行に加え、後ろ5行も抽出する
grep -B 5 "hoge" example.txt
hogeが存在する行に加え、前5行も抽出する
grep -C 5 "hoge" example.txt
hogeが存在する行に加え、前後5行も抽出する
AND検索
パイプラインで繋げば良い。
grep "hoge" example.txt | grep "foo"
hogeとfooが両方含まれる行を抽出。
grep -A 5 "hoge" example.txt | grep "foo"
grep -B 5 "hoge" example.txt | grep "foo"
hogeが含まれる行に加え、その前(後ろ)5行を抽出。更にそこからfooが含まれる行を抽出。
OR検索
grep -e "hoge" -e "foo" example.txt
grep -A 5 "hoge" example.txt | grep -e "foo" -e "bar"
-eオプションを使うことで検索ワードを複数指定できる
複数ファイルを対象にして検索をかける
例えば
20200101.log
みたいな、ファイル名が
YYYYMMDD.log
ってフォーマットのログファイル群があったとして
grep "hoge" 202001*.log
ワイルドカード「*」をファイル名の一部に使うことで2020年1月のログファイル全てを対象に取って検索をかけることができる。
Apacheのアクセスログに対してgrepをかける時によくやるヤツ
特定のページへのアクセスを抜き出す
grep "T /hoge" access_log
「T 」をつけるのがミソで、こうすることで
GET /hoge
ならびに
POST /hoge
を拾いつつ、リファラがヒットしてしまうのを回避できる。
grep "T /hoge" access_log | grep "192.168.1.1"
さらにIPアドレスとかで絞り込みしたい時はパイプラインを使えばOK。
まとめ
grepでは正規表現も使えるけど、それを使うまでもなく単純なオプションの組み合わせで案外何とかなる場面が多いように感じる。
Windowsでgrep使いたい? PowerShellに「Select-String」ってコマンドがあるからそれを使うといいよ。