grep コマンド

ファイルや標準入力から正規表現でマッチする行を探し出すコマンド。

ログファイルの中から特定のログを探し出したり、ソースコードのコード検索したり、いろいろな目的で使う。

※ 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
通常だとgrepがバイナリだと認識してしまうファイルも強制的にテキストとして認識させる。 テキストファイルでも最初の方に少しテキストでないバイナリがゴミとかで含まれちゃっていると、 grepはバイナリファイルだと勘違いしてしまう。バイナリ扱いになってしまうと、差分の内容が表示されないので、 無理にテキストファイルとして扱わせるオプション。 -a, --textgit 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
検索結果の出力にファイル名を付ける。 検索対象のファイルが1つの場合にはデフォルトではファイル名は出力されず、 複数の場合にはデフォルトでファイル名が出力される。 このオプションを付けるとたとえファイルが1つでもファイル名が出力される。 git grep では付けても意味がないみたい。
-o
マッチした部分のみを表示する。このオプションがなければマッチした行全体を表示する。 git grep では使えない。
-r
ディレクトリを再帰的にたどって検索する。 git grep では使えないが、このオプションを付けなくてもディレクトリを再帰的にたどってくれる。
-v
通常とは逆に、マッチしない行を出力する。 git grep でも使える。

HOWTO

git管理下のディレクトリを再帰的にgrepするには

git grep というコマンドは grep とほとんど同じように使えて、検索対象を指定しなくてもカレントディレクトリから下のgitで管理しているファイルのみを検索してくれる。 .gitignore に登録されていて、git管理対象外のファイルは検索されない。

$ git grep PATTERN

Binary file foo.txt matches というように表示されてしまう場合

テキストファイルをgrepしたつもりなのに、Binary File と言われてしまったら、オプション -a を付ける。

$ grep -a blahbla foo.txt

-a の代わりに --text--binary-files=text でも同じ。

-a, --textgit 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, ver
lib('Word.Appl
,$newWord);
wrongWord = "s
rightWord = "j
wrongWord,$rig
($newWord);$x+
,$newWord[$x])
 $newWord);
e/bwdWordCache
tion>Word stri
rd='>Word Proc
rd='>Word Proc
rd='>Word Proc

ログファイルなどの tail -f の出力をgrepで絞り込んで表示するには

このサイトは筆者(hydrocul)の個人メモの集合です。すべてのページは永遠に未完成です。
スポンサーリンク