私は最近このワンライナーを見ました:
$ ps -ef | grep [f]irefox
thorsen 16730 1 1 Jun19 ? 00:27:27 /usr/lib/firefox/firefox ...
そのため、データに「firefox」が含まれるプロセスのリストが返されるようですが、grepプロセス自体は除外されるため、おおよそ次のようになります。
ps -ef |grep -v grep| grep firefox
しかし、それがどのように機能するのか理解できません。私はgrepなどのmanページを見てきましたが、説明は見つかりませんでした。
そして、私が実行した場合に謎を悪化させるには:
$ ps -ef | grep firefox > data
$ grep [f]irefox data
thorsen 15820 28618 0 07:28 pts/1 00:00:00 grep --color=auto firefox
thorsen 16730 1 1 Jun19 ? 00:27:45 /usr/lib/firefox/firefox ....
[t] rickは動作しなくなったようです!
ここの誰かは、私が確信していることを知っているでしょう。
ありがとう。
角括弧式は、 bashシェル(およびその他のシェル) grepの文字クラスパターンマッチング。
grep
プログラムは、デフォルトでPOSIXの基本的な正規表現を理解します。それを使用して、文字クラスを定義できます。たとえば、ps -ef | grep [ab9]irefox
は「airefox」、「birefox」、「9irefox」が存在する場合は存在しますが、「abirefox」。
grep [a-zA-Z0-9]irefox
コマンドは、正確に1文字または数字で始まり、「irefox」で終わるすべてのプロセスを検出します。
したがって、ps -ef | grep firefox
は、firefox
を含む行を検索します。 grepプロセス自体には「firefox」が含まれているため、grepはそれも検出します。 []
を追加することにより、文字クラス "[f]"(文字 "f"のみで構成されるため、括弧なしの "f"と同等)のみを検索します。括弧の利点は、文字列「firefox」がgrepコマンドに表示されなくなることです。したがって、grep自体はgrepの結果に表示されません。
一般的に、文字クラスのマッチングや正規表現として角括弧に精通している人はそれほど多くないため、2番目の結果は少し不思議に見えるかもしれません。
2番目の結果を修正する場合は、次の方法で使用できます。
ps -ef | grep [f]irefox > data
grep firefox data
その理由は、文字列
grep firefox
パターンfirefox
と一致しますが、文字列は
grep [f]irefox
パターン[f]irefox
(パターンfirefox
と同等)と一致しません。
そのため、最初のgrepは独自のプロセスコマンドラインと一致しますが、2番目のgrepは一致しません。