psをgrepした結果からgrep自身を除外する方法

当ページのリンクには広告が含まれています。

スポンサーリンク

psをgrepした結果からgrep自身を除外する方法を紹介します。

現在実行されているプロセスを表示する「psコマンド」は、Linuxの構築・運用時のプロセス起動を確認する場合によく使います。実行結果を見やすくするためにパイプ(|)を使って、「grepコマンド」と併用することが多いですね。

例えば、「apache」が起動しているかどうかを確認する場合など。

しかし、grepコマンドを実行した結果に自身のgrepが表示されているのは、なんだか邪魔臭い……気持ち悪いですよね。せっかく!grepしてるに不要なものが混ざっている……。そんな印象です。

というわけで、ここでは psをgrepした結果からgrep自身を除く方法を紹介します。

psをgrepした結果にしゃしゃり出てくるgrep自身……

たとえば、Apacheが起動しているかを確認する際、psコマンドにパイプ(|)を通して、grepすると、しゃしゃり出てきますね。grep自身が……。

# ps axf | grep httpd
30021 pts/0    D+     0:00          \_ grep httpd
54623 ?        Ss     0:00 /usr/sbin/httpd
54625 ?        S      0:00  \_ /usr/sbin/httpd

ここでは、grep自身を除く2つの方法を紹介します。

grep自身を除く方法

1. オプション -v を利用

psをgrepした結果をオプション -v を使って、もう一度grepします。-v は、指定した文字列とマッチしなかった行を表示するgrepのオプションです。

# ps axf | grep httpd | grep -v grep
54623 ?        Ss     0:00 /usr/sbin/httpd
54625 ?        S      0:00  \_ /usr/sbin/httpd

文字列にgrepを指定しているので、grep自身が除外されていますね。

2. [ ] 角括弧(かくかっこ)を利用

次に紹介するのは、1.の方法より楽なエレガントな方法です。[ ] 角括弧(かくかっこ)を利用し、grepコマンドを実行します。

# ps axf | grep [h]ttpd
54623 ?        Ss     0:00 /usr/sbin/httpd
54625 ?        S      0:00  \_ /usr/sbin/httpd

grep自身が除外されていますね。エレガント!

[ ] 角括弧(かくかっこ)は、[]内の任意の文字にマッチすることを表しますので、[]内に複数の文字を入れても、hが入っていれば適切にgrepされます。逆にhが入っていなければ、grepされません。

# ps axf | grep [anh]ttpd
54623 ?        Ss     0:00 /usr/sbin/httpd
54625 ?        S      0:00  \_ /usr/sbin/httpd

# ps axf | grep [abi]ttpd

なぜ[ ] 角括弧(かくかっこ)を利用するとgrep自身は除かれるのか

なぜ[ ] 角括弧(かくかっこ)を利用するとgrep自身は除かれるのかが最近になってようやく分かりましたので、紹介します。

「なぜ[ ] 角括弧(かくかっこ)を利用するとgrep自身は除かれるのか?」ではなく、「どうすれば[ ]角括弧(かくかっこ)の文字列をgrepできるか?」というアプローチで説明します。

まずは、[h]ttpdという文字列をパイプで渡すために -e オプションをつけて複数の文字列を指定し、grepコマンドを実行します。

# ps axf | grep -e [h]ttpd -e grep
19588 pts/0    S+     0:00          \_ grep -e [h]ttpd -e grep
54623 ?        Ss     0:00 /usr/sbin/httpd
54625 ?        S      0:00  \_ /usr/sbin/httpd

この結果に対して、「2. grep自身を除く方法:[ ] 角括弧(かくかっこ)を利用」で紹介した方法で[h]ttpdをgrepしてみます。すると、先ほどと同様にgrep自身は除外されることが分かります。当然ですね。

# ps axf | grep -e [h]ttpd -e grep | grep [h]ttpd
54623 ?        Ss     0:00 /usr/sbin/httpd
54625 ?        S      0:00  \_ /usr/sbin/httpd

次に'\[h\]ttpd'でgrepします。ちなみに\はエスケープ処理といって、記号を文字列の記号として認識するために使います。

# ps axf | grep -e [h]ttpd -e grep | grep '\[h\]ttpd'
19588 pts/0    S+     0:00          \_ grep -e [h]ttpd -e grep

[ ]角括弧(かくかっこ)の文字列をgrepできましたね。

つまり、パイプを通して渡される[ ]角括弧(かくかっこ)は、[ ]内の任意の文字にマッチすることを表しているのではなく、単なる文字列の記号なので、grep自身の行は除かれるのです。

以上で、「psをgrepした結果からgrep自身を除く方法」は終了です。

TIPS の人気記事

  1. ランレベルとは(chkconfig)

関連記事(一部広告含む)