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自身を除く方法」は終了です。