エンジニアを目指す初学者に向けて、わかりやすく解説したブログです。
サイトをリニューアルしました

【Linux】grepコマンドのよく使うオプションだけ厳選

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

検索対象からディレクトリを除外する

--exclude-dirオプションを使うことで、 node_modulesdist など特定のディレクトリを検索対象から除外することができる。

# 「node_modules」と「.nx」と「dist」というディレクトリは検索対象外にする
$ grep -r 'date-fns' --exclude-dir={node_modules,.nx,dist}
./yarn.lock:"date-fns@npm:^4.1.0":
./yarn.lock:  resolution: "date-fns@npm:4.1.0"
./yarn.lock:    date-fns: "npm:^4.1.0"
./package.json:    "date-fns": "^4.1.0",
./src/components/BlogJsonLd.astro:import { formatISO } from 'date-fns'

詳しくは以下の記事で紹介している。

📄Arrow icon of a page linkgrepで特定のディレクトリを検索対象から除外する

まとめ

およそ以下を覚えておけば、大抵の絞り込みは行うことができる。

  • -r:ディレクトリ配下の複数ファイルから検索
  • -i:大文字小文字無視
  • -A, -B:ヒット行の前や後も表示
  • -v:除外
  • --exclude-dir :検索対象からディレクトリを除外