grep コマンド 2017/01/04
ファイルや標準入力から正規表現でマッチする行を探し出すコマンド。
ログファイルの中から特定のログを探し出したり、ソースコードのコード検索したり、いろいろな目的で使う。
※ grepよりも高速に検索できる ack-grep などもある。
※ Perlには同じ名前のgrepという関数がある。
※ git管理下のディレクトリの場合には git grep も便利。
基本的な使い方 2016/01/25
grep [オプション...] パターン [ファイル...]
パターンを最後に書きたい場合は以下のように -e で明示的にパターンを指定する。
grep [オプション...] [ファイル...] -e パターン
ファイルを指定しないと標準入力をパターンマッチングする。
私がソースコード一式のディレクトリの中から特定の単語を探すときには、再帰的に検索、かつ行番号もほしいので、たいてい
grep -rn foo *
のように -rn オプションを付けて使っている。これはディレクトリを再帰的にたどり、見つかった行は行番号を付して表示するオプションである。
gitレポジトリのディレクトリで最後の*を.にして実行すると.gitの中も検索されちゃうので、とりあえず最後は * にする癖にしている。
オプション 2017/01/04
パラメータを取らない1文字(ハイフン含めれば2文字)のオプションは、つなげることができる。つまり -r -n -i は -rni と書ける。
-a,--text,--binary-files=text- 通常だとgrepがバイナリだと認識してしまうファイルも強制的にテキストとして認識させる。
テキストファイルでも最初の方に少しテキストでないバイナリがゴミとかで含まれちゃっていると、
grepはバイナリファイルだと勘違いしてしまう。バイナリ扱いになってしまうと、差分の内容が表示されないので、
無理にテキストファイルとして扱わせるオプション。
-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- 検索結果の出力にファイル名を付ける。
検索対象のファイルが1つの場合にはデフォルトではファイル名は出力されず、
複数の場合にはデフォルトでファイル名が出力される。
このオプションを付けるとたとえファイルが1つでもファイル名が出力される。
git grepでは付けても意味がないみたい。 -o- マッチした部分のみを表示する。このオプションがなければマッチした行全体を表示する。
git grepでは使えない。 -r- ディレクトリを再帰的にたどって検索する。
git grepでは使えないが、このオプションを付けなくてもディレクトリを再帰的にたどってくれる。 -v- 通常とは逆に、マッチしない行を出力する。
git grepでも使える。
HOWTO
git管理下のディレクトリを再帰的にgrepするには 2017/01/04
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 でも使える。
シェルスクリプトでファイルにパターンが見つかるかどうかで分岐をさせるには 2015/12/09
パターンがファイルに見つかる場合に終了コード0(成功)、見つからない場合に終了コード1(失敗)を返すので、以下のように書けばよい。
if grep PATTERN FILE_PATH >/dev/null; then
# ファイルにパターンが見つかる場合
else
# ファイルにパターンが見つからない場合
fi
ファイルではなく変数に入っている文字列で検査したい場合は以下のように書けばよい。
if echo "$STR" | grep PATTERN >/dev/null; then
# $STR がパターンにマッチする場合
else
# $STR がパターンにマッチしない場合
fi
マッチした行の前後数行を表示するには 2017/01/04
-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 でも使える。
複数のパターンで検索するには 2016/01/25
-e オプションでパターンを複数指定すればOR検索になる。
APATTERN か BPATTERN どちらかまたは両方のある行を検索
$ grep -e APATTERN -e BPATTERN foo.txt
以下のように拡張正規表現で | を使っても同じだが。
$ grep -E 'APATTERN|BPATTERN' foo.txt
大文字小文字区別せずに検索するには 2017/01/04
-i または --ignore-case オプションを付けると大文字小文字区別せずに検索してくれる。
$ grep -i PATTERN foo.txt
これらのオプションは git grep でも使える。
行頭または行末に限定してパターンを検索するには 2015/09/11
行頭を表す正規表現 ^ または行末を表す正規表現 $ を使う。
行頭の hoge を検索する例
$ grep '^hoge' foo.txt
行末の hoge を検索する例
$ grep 'hoge$' foo.txt
逆に行頭または行末を除外してパターンを検索するには 2015/09/11
行頭以外の hoge を検索する例。つまり行の途中や行末に限定。
$ grep '[^^]hoge' foo.txt
行末以外の hoge を検索する例。つまり行の先頭や行の途中に限定。
$ grep '[^$]hoge' foo.txt
[] の中の1文字目が ^ の場合は [] の中の文字以外という意味で、
[^abc] と書くと、abc 以外の任意の1文字となる。そこに行頭を表す ^ を入れて、
[^^] とすると行頭以外の任意の1文字という意味になる。ハイライト表示させるとわかるが、hogeの前の1文字もハイライトになってパターンにマッチしていることがわかる。
同様に [^$] と書くと、行末($)以外の任意の1文字という意味になる。従ってhogeの次の1文字もハイライトになる。
マッチした部分をハイライト表示するには 2017/01/04
--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
マッチした部分とその前後一定文字数のみを表示するには 2016/09/26
パターンの前後に .{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