最近、会社の同僚から教えてもらったTipsですが、コマンドラインで
% ps auxww | grep httpd
とやったときに「grep httpd」自体のプロセスをひっかけないようにする方法です。 実際やってみるとわかりますが、タイミングが悪いと下記のように「grep httpd」自体もひっかかってしまいます。そんなに実害はないけど、なんだかちょっと気持ち悪い。と思っていたのは自分だけではないはず。
www       3811  0.0  3.3 216244 14732  ??  S    12:52AM   0:00.38 /path/to/bin/httpd -k start
www       4511  0.0  1.4 207900  6456  ??  S     1:13AM   0:00.00 /path/to/bin/httpd -k start
root     59037  0.0  1.4 207860  6372  ??  Ss   23Jul07  11:30.38 /path/to/bin/httpd -k start
yoshiki   4530  0.0  0.0   348   208  p2  R+    1:13AM   0:00.00 grep httpd
で、結論から言うと
% ps auxww | grep \[h\]ttpd
とやればいいのですが、なんでこれでひっかからなくなるかわかりますか? 以下ネタバレ。 なんで、これでひっかからなくなるかというと「grep \[h\]ttpd」とした場合に、このgrepのプロセスは「grep [h]ttpd」となるのですが、「grep \[h\]ttpd」の「\[h\]ttpd」自体は正規表現(普通は[abc]とかやってaかbかcにマッチさせたりしますね)で「httpd」にマッチさせることになるため、「grep [h]ttpd」がひっかからなくなるというわけです。 ちょっとしたパズルみたいで面白い。 ちなみに [] をエスケープしてるのはシェルで [] が意味をもってるためです。 これはシングルクオートで囲んで「grep '[h]ttpd'」とやっても同じです。 #でもpsかgrep自体に、これと同等のことができるオプションがあったような記憶もあるんだけど思い違いかなぁ