前置き
前のお手軽! grep findのときに面倒だったので、grepの引数は省略しました。
もったいないので、こちらでその続きです。前の記事と合わせると少し便利です。
本題
全部は紹介しませんが、たまに便利なものだけ紹介します。
また、LinuxのGNU Grepで試しているので、*BSD, MacOSではどうなるかわかりません。
-H
ファイル名出力を強制
ファイル1個だけだとファイル名が出ません。
$ (echo moge; echo hoge; echo muga) > foo.c # リテラルで改行出すやり方わからないのでこれで勘弁して。
$ grep hoge foo.c
hoge
-H
でファイル一個でもファイル名がつきます。--with-filename
という別名もあります。
$ (echo moge; echo hoge; echo muga) > foo.c
$ grep -H hoge foo.c
foo.c:hoge
-n
行番号も出力する
-n
で行番号もつきます。私は-nH
をつけるのを好みます。
$ (echo moge; echo hoge; echo muga) > foo.c
$ grep -nH hoge foo.c
foo.c:2:hoge
-l
むしろマッチしたファイル名だけ表示
$ for f in {foo,bar,baz}.c; do (echo moge; echo hoge; echo muga) > $f; done
$ grep -l *.c
bar.c
baz.c
foo.c
-L
またはマッチしないファイル名だけ表示
$ for f in {foo,bar,baz}.c; do (echo moge; echo hoge; echo muga) > $f; done
$ touch poo.c
$ grep -L *.c
poo.c
-v
マッチしない行を表示(条件反転)
$ for f in {foo,bar,baz}.c; do (echo moge; echo hoge; echo muga) > $f; done
$ grep -v hoge *.c
bar.c:moge
bar.c:muga
baz.c:moge
baz.c:muga
foo.c:moge
foo.c:muga
-An,-Bn,-Cn
マッチした行とその前後を表示(--after-context
, --before-context
, --context
)
-An
は、マッチした行と、そのn行下まで表示する。:
が付いているのがマッチした行、-
が付いているのが-An
で追加して表示されている行。
$ for f in {foo,bar,baz}.c; do (echo moge; echo hoge; echo muga) > $f; done
$ grep -A2 -nH moge *.c
bar.c:1:moge
bar.c-2-hoge
bar.c-3-muga
--
baz.c:1:moge
baz.c-2-hoge
baz.c-3-muga
--
foo.c:1:moge
foo.c-2-hoge
foo.c-3-muga
-Bn
は、マッチした行と、そのn行上まで表示する。:
が付いているのがマッチした行、-
が付いているのが-Bn
で追加して表示されている行。
$ for f in {foo,bar,baz}.c; do (echo moge; echo hoge; echo muga) > $f; done
$ grep -B2 -nH muga *.c
bar.c-1-moge
bar.c-2-hoge
bar.c:3:muga
--
baz.c-1-moge
baz.c-2-hoge
baz.c:3:muga
--
foo.c-1-moge
foo.c-2-hoge
foo.c:3:muga
-Cn
は、マッチした行と、その前後n行ずつを表示する。:
が付いているのがマッチした行、-
が付いているのが-Cn
で追加して表示されている行。
$ for f in {foo,bar,baz}.c; do (echo moge; echo hoge; echo muga) > $f; done
$ grep -C1 -nH hoge *.c
bar.c-1-moge
bar.c:2:hoge
bar.c-3-muga
--
baz.c-1-moge
baz.c:2:hoge
baz.c-3-muga
--
foo.c-1-moge
foo.c:2:hoge
foo.c-3-muga
ユースケース
コードから気になる箇所をgrep
で見つけたけど途中で改行されていた、なんてときには-An
は便利です。
その他
時間があれば、以下に目を通しておくとよいです。
$ grep --help
$ man grep
$ info grep