ファイルや標準入力から正規表現でマッチする行を探し出すコマンド。
ログファイルの中から特定のログを探し出したり、ソースコードのコード検索したり、いろいろな目的で使う。
※ grepよりも高速に検索できるack-grep などもある。
※ Perlには同じ名前のgrep
という関数がある。
※ git管理下のディレクトリの場合にはgit grep
も便利。
grep [オプション...] パターン [ファイル...]
パターンを最後に書きたい場合は以下のように-e
で明示的にパターンを指定する。
grep [オプション...] [ファイル...] -e パターン
ファイルを指定しないと標準入力をパターンマッチングする。
私がソースコード一式のディレクトリの中から特定の単語を探すときには、再帰的に検索、かつ行番号もほしいので、たいてい
grep -rn foo *
のように-rn
オプションを付けて使っている。これはディレクトリを再帰的にたどり、見つかった行は行番号を付して表示するオプションである。
gitレポジトリのディレクトリで最後の*
を.
にして実行すると.git
の中も検索されちゃうので、とりあえず最後は*
にする癖にしている。
パラメータを取らない1文字(ハイフン含めれば2文字)のオプションは、つなげることができる。つまり-r -n -i
は-rni
と書ける。
-a
,--text
,--binary-files=text
-a
,--text
はgit grep
でも使える。-A
行数git grep
でも使える。-B
行数git grep
でも使える。-C
行数-A
と-B
をいっしょに指定できる。-C3
はたぶん-A3 -B3
と同じ。git grep
でも使える。--color=always
less -R
を使いたいときには、パイプなのにカラー表示したい、という状況になる。git grep
でも使える。-e
パターン-e
オプションがない場合は最初のパラメータがパターンと見なされる。git grep
でも使える。-E
(foo|bar)
のような表記の正規表現を使うには、このオプションが必要。git grep
でも同じ。-h
-l
と併用すると-h
は無視される。git grep
でも使える。-i
git grep
でも使える。-l
git grep
でも使える。-L
git grep
でも使える。--line-buffered
tail -f
などからパイプで受け取るときに便利。git grep
では使えない。-n
,--line-number
git grep
でも使える。-H
git grep
では付けても意味がないみたい。-o
git grep
では使えない。-r
git grep
では使えないが、このオプションを付けなくてもディレクトリを再帰的にたどってくれる。-v
git grep
でも使える。git grep
というコマンドはgrep
とほとんど同じように使えて、検索対象を指定しなくてもカレントディレクトリから下のgitで管理しているファイルのみを検索してくれる。.gitignore
に登録されていて、git管理対象外のファイルは検索されない。
$ git grep PATTERN
Binary file foo.txt matches
というように表示されてしまう場合2017/01/04テキストファイルをgrepしたつもりなのに、Binary File
と言われてしまったら、オプション-a
を付ける。
例
$ grep -a blahbla foo.txt
-a
の代わりに--text
や--binary-files=text
でも同じ。
-a
,--text
はgit grep
でも使える。
パターンがファイルに見つかる場合に終了コード0(成功)、見つからない場合に終了コード1(失敗)を返すので、以下のように書けばよい。
if grep PATTERN FILE_PATH >/dev/null; then # ファイルにパターンが見つかる場合else # ファイルにパターンが見つからない場合fi
ファイルではなく変数に入っている文字列で検査したい場合は以下のように書けばよい。
if echo "$STR" | grep PATTERN >/dev/null; then # $STR がパターンにマッチする場合else # $STR がパターンにマッチしない場合fi
-C
オプションで表示する行数を指定する。または-A
オプションと-B
オプションで指定する。
-A
はマッチした行の後ろ(After)を何行表示するか、-B
はマッチした行の前(Before)を何行表示するか、を指定する。
-C
はたぶん前後が同じ行数のときにまとめて指定できるオプション。
## マッチした行とその前3行、後ろ3行を表示$ grep -C3 blahbla foo.txt## マッチした行とその前5行、後ろ3行を表示$ grep -A3 -B5 blahbla foo.txt
これらのオプションはgit grep
でも使える。
-e
オプションでパターンを複数指定すればOR検索になる。
APATTERN か BPATTERN どちらかまたは両方のある行を検索
$ grep -e APATTERN -e BPATTERN foo.txt
以下のように拡張正規表現で|
を使っても同じだが。
$ grep -E 'APATTERN|BPATTERN' foo.txt
-i
または--ignore-case
オプションを付けると大文字小文字区別せずに検索してくれる。
$ grep -i PATTERN foo.txt
これらのオプションはgit grep
でも使える。
行頭を表す正規表現^
または行末を表す正規表現$
を使う。
行頭のhoge
を検索する例
$ grep '^hoge' foo.txt
行末のhoge
を検索する例
$ grep 'hoge$' foo.txt
行頭以外のhoge
を検索する例。つまり行の途中や行末に限定。
$ grep '[^^]hoge' foo.txt
行末以外のhoge
を検索する例。つまり行の先頭や行の途中に限定。
$ grep '[^$]hoge' foo.txt
[]
の中の1文字目が^
の場合は[]
の中の文字以外という意味で、[^abc]
と書くと、abc
以外の任意の1文字となる。そこに行頭を表す^
を入れて、[^^]
とすると行頭以外の任意の1文字という意味になる。ハイライト表示させるとわかるが、hoge
の前の1文字もハイライトになってパターンにマッチしていることがわかる。
同様に[^$]
と書くと、行末($
)以外の任意の1文字という意味になる。従ってhoge
の次の1文字もハイライトになる。
--color
を付けるとパターンにマッチした部分を色付きで表示してくれる。
grep
の出力をパイプで他のコマンドにつなげたときには--color
でも色付きにしてくれないので、--color=always
と書く。
$ grep --color PATTERN foo.txt$ grep --color=always PATTERN foo.txt | head
パイプでless
コマンドに流す場合には、色を示すエスケープシーケンスがデフォルトでは正しく表示されないので、less
に-R
というオプションを付ける。
$ grep --color=always PATTERN foo.txt | less -R
git grep
は出力をパイプにしても--color
だけで十分。
$ git grep --color PATTERN foo.txt | less -R
というか、git
ではページャが設定されていることが多いので、less
とつなげる必要はなさそう。
$ git grep --color PATTERN foo.txt
パターンの前後に.{5}
みたいなのを付けて、オプション-o
を付けると、パターンにマッチした部分とその前後5文字ずつが出力される。
$ grep -h -r -E '.{5}Word.{5}' -o *aded Word, verlib('Word.Appl,$newWord);wrongWord = "srightWord = "jwrongWord,$rig($newWord);$x+,$newWord[$x]) $newWord);e/bwdWordCachetion>Word strird='>Word Procrd='>Word Procrd='>Word Proc
tail -f
の出力をgrepで絞り込んで表示するには