web-dev-qa-db-ja.com

grepのこの[t] rickyブラケット式はどのように機能しますか?

私は最近このワンライナーを見ました:

$ 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は動作しなくなったようです!

ここの誰かは、私が確信していることを知っているでしょう。

ありがとう。

38
Thorsen

角括弧式は、 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

(参照)

56
jokerdino

その理由は、文字列

grep firefox

パターンfirefoxと一致しますが、文字列は

grep [f]irefox

パターン[f]irefox(パターンfirefoxと同等)と一致しません。

そのため、最初のgrepは独自のプロセスコマンドラインと一致しますが、2番目のgrepは一致しません。

10