自分用メモ。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
--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としてが認識されてしまわないためです。