明滅するプログラマの思索

WEBエンジニアとして勤務している一介の男が、日々気づいたことをまとめるブログです

ps ax|grep コマンドで自分自身を除く

ps コマンドと grep コマンドを使って、実行中のプロセスを確認するとき、結果にその実行コマンドも含まれてしまいます。
たとえば、httpd プロセスを確認するとき、以下のように書きますが、

$ ps ax|grep httpd
 1468 ?        Sl     1:11 /usr/sbin/httpd
 1469 ?        Sl     1:05 /usr/sbin/httpd
 1470 ?        Sl     1:13 /usr/sbin/httpd
 1471 ?        Sl     1:05 /usr/sbin/httpd
 1472 ?        Sl     1:06 /usr/sbin/httpd
 1473 ?        Sl     1:04 /usr/sbin/httpd
 1474 ?        Sl     1:07 /usr/sbin/httpd
 1475 ?        Sl     1:13 /usr/sbin/httpd
 6760 pts/7    S+     0:00 grep httpd      ←実行コマンドが含まれる
19200 ?        Sl     1:09 /usr/sbin/httpd
19201 ?        Sl     1:09 /usr/sbin/httpd
19271 ?        Sl     1:07 /usr/sbin/httpd
19272 ?        Sl     1:06 /usr/sbin/httpd
20058 ?        Sl     1:04 /usr/sbin/httpd
22555 ?        Ss     5:04 /usr/sbin/httpd
22600 ?        Sl     1:02 /usr/sbin/httpd
22602 ?        Sl     1:02 /usr/sbin/httpd
22603 ?        Sl     1:05 /usr/sbin/httpd
24020 ?        Sl     1:00 /usr/sbin/httpd
24029 ?        Sl     0:59 /usr/sbin/httpd

実行したコマンド自体が grep 対象となってしまい、結果に含まれます。
このとき、実行コマンドを結果から除く方法はいくつかありますが、私が積極的に使っている方法は以下のようなものです。

ps ax|grep [h]ttpd
 1468 ?        Sl     1:11 /usr/sbin/httpd
 1469 ?        Sl     1:05 /usr/sbin/httpd
 1470 ?        Sl     1:13 /usr/sbin/httpd
 1471 ?        Sl     1:05 /usr/sbin/httpd
 1472 ?        Sl     1:06 /usr/sbin/httpd
 1473 ?        Sl     1:04 /usr/sbin/httpd
 1474 ?        Sl     1:07 /usr/sbin/httpd
 1475 ?        Sl     1:13 /usr/sbin/httpd
19200 ?        Sl     1:09 /usr/sbin/httpd
19201 ?        Sl     1:09 /usr/sbin/httpd
19271 ?        Sl     1:07 /usr/sbin/httpd
19272 ?        Sl     1:06 /usr/sbin/httpd
20058 ?        Sl     1:04 /usr/sbin/httpd
22555 ?        Ss     5:04 /usr/sbin/httpd
22600 ?        Sl     1:02 /usr/sbin/httpd
22602 ?        Sl     1:02 /usr/sbin/httpd
22603 ?        Sl     1:05 /usr/sbin/httpd
24020 ?        Sl     1:00 /usr/sbin/httpd
24029 ?        Sl     0:59 /usr/sbin/httpd

grep のパラメータの先頭1文字を (大カッコ)でくくります。
grep の
(大カッコ)は、そこに含まれる任意の1文字を表します。
つまり grep httpdgrep [h]ttpd は同じ条件で grep していることになります。

では、なぜ grep [h]ttpd だと自分自身が除かれるのでしょうか?
それは、grep [h]ttpd という実行コマンドが、grep [h]ttpd の条件に当てはまらないからです。
実行コマンドには [] (大カッコ)がついており、 grep の条件 httpd には一致しないのですね。
grep [h]ttpd というプロセスは存在しているが、grep の対象外となるわけです。