grepコマンドはファイルの中身の文字列を検索するのによく利用するコマンドである。
様々なオプションがあるが、よく使うパターンのみを厳選した。
普通に文字列を検索する
あるファイルの中の文字列を検索する
「grep ファイル名
」でも検索できるが、cat→パイプgrepの形式の方が
個人的には直感的で分かりやすいため、この形式を多用している。
# target_file.txtから「hoge」を検索
$ cat target_file.txt | grep 'hoge'
grepする文字列hoge
はシングルクォートで囲ったり囲まなかったりいい加減。
特殊文字列が入るときは気を付ける。
あるディレクトリ配下全てを対象に、大文字小文字区別なく検索
あるプロジェクト全体を検索したいときによく発生するパターン。
- 対象:全部
- キーワード:大文字小文字は無視して検索したい
という条件の場合、下記オプションが有効。
オプション | 意味 |
-r | ディレクトリ内も検索対象とする |
-i | 大文字と小文字を区別しない |
-l | 結果にファイル名だけを表示する |
# target_dirディレクトリから、「hoge」を検索
$ grep -ir 'hoge' target_dir
# ヒット数が多すぎてファイル名だけ出力したい場合
$ grep -irl 'hoge' target_dir
# 拡張子がわかっているので、さらに拡張子で絞り込む(htmlのみ)
$ grep -il 'hoge' target_dir/**/*.html
ヒットした前後の行も表示する
grepコマンドは、デフォルトだとヒットした行だけしか抽出しない。
ログファイルを検索しているときなどは
「エラーログ発生の原因も知りたいから、エラーログの上の行も一緒に表示したい」
というケースがよくある。
オプションは以下の通り。
オプション | 意味 |
-C 行数 | 前後に指定した行数を表示 |
-B 行数 | 一致した行の前の行も表示 |
-A 行数 | 一致した行の後の行も表示 |
# サンプルデータ
$ cat fruit.txt
apple
banana
orange
grape
strawberry
pineapple
cherry
blueberry
muscat
peach
lemon
# 「pineapple」の上の2行も含めて表示
$ cat fruit.txt | grep -B 2 'pineapple'
grape
strawberry
pineapple
# 「pineapple」の下の3行も含めて表示
$ cat fruit.txt | grep -A 3 'pineapple'
pineapple
cherry
blueberry
muscat
OR検索する
OR検索で一番簡単な方法は-e
オプションを利用すること。
# 「cherry」 or 「strawberry」でOR検索する
$ cat fruit.txt | grep -e 'cherry' -e 'strawberry'
strawberry
cherry
余計にヒットしてしまうものを除外する
-v
オプションを利用すると、指定した文字列を除外することができる。
その際は検索用のgrepと除外用のgrepをパイプで繋げるイメージ。
# 「apple」は検索したいけど、間違ってヒットしてしまう「pineapple」は除外したい
$ cat fruit.txt | grep 'apple' | grep -v 'pineapple'
apple
まとめ
およそ以下を覚えておけば、大抵の絞り込みは行うことができる。
-r
:ディレクトリ配下の複数ファイルから検索-i
:大文字小文字無視-A
,-B
:ヒット行の前や後も表示-v
:除外