pockestrap

Web Programmer's memo

便利なgrep

自分用メモ。grepを網羅しているわけでもなし、他のブログ等から比べた新規性があるわけでもなし。
正確な情報を知りたければ、manを読んで。
agとか言う便利ツールがあるそうだけど、使ったことないなぁ。

使い方

### file の内容をパターンマッチ
$ grep '[0-9]' file

### ps の結果からパターンマッチ
$ ps aux | grep '[m]ikutter'

### ディレクトリ以下のファイルを再帰的にパターンマッチ(zsh)
$ grep 'にゃーん' **/*(.)

便利ですね。

option

色んなオプションがあります。
ちゃんと知りたかったらman読んで。

## file: hoge.rb
x = Hash.new
x[:cat] = 'にゃーん'
x[:dog] = 'わん!'

-F

パターンじゃなくて生の文字列としてマッチングします。

### :, c, a, tのどれかが存在する行を探してしまう。
$ grep '[:cat]' hoge.rb
## file: hoge.rb
x = Hash.new
x[:cat] = 'にゃーん'
x[:dog] = 'わん!'

### [:cat]という文字列にマッチする
$ grep -F '[:cat]' hoge.rb
x[:cat] = 'にゃーん'

エスケープするのがめんどかったら便利かもですね。

-v

マッチしない行を抜き出します。

-c, --count

マッチした文字列ではなく、マッチした行数を出力します。

-n, --line-number

出力の前にファイルの行数を表示します。

$ grep 'にゃーん' hoge.rb
3:x[:cat] = 'にゃーん'

ファイルに対してgrepする時は便利だけど、パイプで渡すときにはいらないですね。

--color=auto

出力に色をつけます。

$ grep 'にゃーん' hoge.rb --color=auto -n --with-filename

hoge.rb:3:x[:cat] = 'にゃーん'
grepしたのを単語単位で目grepとかしなくて済みますね。

--binary-files=TYPE

TYPEにwithout-matchを指定すると、バイナリファイルにはマッチしなくなります。
-Iオプションも等価

$ grep 'e' a.out
Binary file a.out matches
$ grep 'e' a.out --binary-files=without-match        # 何も表示されない
$ echo $?
1
$ gre 'e' a.out -I        # これも等価

バイナリファイルが含まれてるディレクトリを再帰的に検索する時に便利ですね。

GREP_OPTIONS

grepのデフォルトオプションを指定します。

### file:~/.zshrc
GREP_OPTIONS='--color=auto --binary-files=without-match'

のように、.zshrc(.bashrc)などにかいておくと便利でしょう。
デフォルトオプションは、コマンドラインで指定するオプションの前におかれるので、コマンドラインでデフォルトオプションを上書きすることが可能です。

tips みたいな

LANG=C grep

$ LANG=C grep 'hoge' fuga.txt

みたいに、LANGをCにしてgrepすると早くなるようです。
実際にtimeではかってみるとそこそこの差が出る。

### file:.zshrc
alias grep='LANG=C grep'

とかしておくといいかも。なんか副作用とかあるかもしれないけど知らん。

ps aux | grep '[m]ikutter'

最初の使い方のとこで出したやつ。

$ ps aux | grep mikutter
pocke    18330  0.0  0.0  11616  1092 pts/1    S+   12:25   0:00 grep mikutter
pocke    31538  0.0  0.0  14452  1620 ?        Ss   Dec21   0:00 /bin/sh /usr/bin/mikutter
pocke    31539  3.1  3.5 1547632 281492 ?      Sl   Dec21  29:40 ruby /opt/mikutter/mikutter.rb

$ ps aux | grep '[m]ikutter'
pocke    31538  0.0  0.0  14452  1620 ?        Ss   Dec21   0:00 /bin/sh /usr/bin/mikutter
pocke    31539  3.1  3.5 1545584 281512 ?      Sl   Dec21  29:44 ruby /opt/mikutter/mikutter.rb

普通にやっちゃうと、grep自身のプロセスも拾ってきてしまうという話ですね。
普通に使っている分には気にならないだろうけど、シェルスクリプトを組むときには問題になるかも。


ちなみに、[m]というのは内の任意の文字にマッチする正規表現。
[m]ならば、mのみにマッチするから [m]ikutter と mikutter はマッチする文字列は等価ってわけですね。
[m]ikutterの時にパターンをクオートで囲んでいるのは、シェルのglobとして
が認識されてしまわないためです。