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


38

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

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

ここの誰かが、何が起こっているのかを知っているでしょう。

ありがとう。


うーん、これは正しいですか?ps -eaf | grep [fF] irefoxの方が理にかなっています。これは正規表現のように見え、囲まれた文字のいずれかに一致します。[0-9]例えば、範囲としても行うことができる
MBS

はい、そうです。それが私が抱えていた問題でした。1人のキャラクターだけを含むキャラクタークラスは無意味に見えましたが、「神秘的な」副作用を生み出していました!とにかくjokerdinoは良い説明を提供してくれました。
トールセン

回答:


57

角括弧式は、bashシェル(および他のシェル) grepの文字クラスパターンマッチングの一部です。

grepデフォルトでは、プログラムはPOSIXの基本的な正規表現を理解します。それを使用して、文字クラスを定義できます。たとえば、ps -ef | grep [ab9]irefox"見つけるだろうirefox"、 " Bの irefox"、 " 9それらが存在する場合irefoxを"ではなく、 " abが irefox"。

このコマンドgrep [a-zA-Z0-9]irefoxは、文字または数字が1つだけで始まり、「irefox」で終わるすべてのプロセスを検出します。

そのps -ef | grep firefoxため、中にある行を検索しますfirefox。grepプロセス自体には「firefox」が含まれているため、grepはそれも見つけます。a []を追加することにより、文字クラス「[f]」のみを検索します(文字「f」のみで構成されているため、括弧なしの「f」と同等です)。括弧の利点は、文字列「firefox」がgrepコマンドに表示されなくなることです。したがって、grep自体はgrepの結果に表示されません。

文字クラスのマッチングや一般的な正規表現として角括弧に精通している人はそれほど多くないため、2番目の結果は少し不思議に見えるかもしれません。

2番目の結果を修正する場合は、次の方法で使用できます。

ps -ef | grep [f]irefox  > data
grep firefox data

(参照)


1
うーん []がgrepがチャンスを得る前にシェルによって解釈されるものであるということは私には思いもしませんでした。説明してくれてありがとう。すべての[m] yteriesが解決されました。
トールセン

お力になれて、嬉しいです。良い一日をお過ごしください:)
jokerdino

1
bashでは、現在の単語に一致するものがない場合(つまり、現在のディレクトリに "firefox"という名前のファイルがない場合)、grepに角括弧渡されます。ただし、grepには文字クラスもあり、grepの[f]はfとまったく同じです。
ダニエルハーシュコヴィッチ

6
実際、この場合、grepの前にシェルによって解釈されるとは思わない。[f]文字クラスのブラケットに一致する正規表現パターンだと思います。「[a-z0-9] irefox」のように、grepは「airefox」と「0irefox」にも一致します。echo $([f])エラーを返すため、bashビルトインではないことが簡単にわかります。
CON-F-使用

4
[f]irefoxこの目的で機能する特定の理由は、シェルによって展開されないことです。シェルがに展開する[f]irefoxfirefox、がgrep表示されfirefox、実行されたかのようにのコマンド文字列のfirefox一部になります。しかし、それの心の中でシェルパターンマッチングを保つために良いので、特にスクリプト、という名前のファイルが存在する場合、現在のディレクトリにはその後、シェルがない拡大、このメソッドが失敗した、すなわち、からのラインが示されています。grepgrep firefoxfirefox[f]irefoxfirefoxgrepps
エリアカガン

10

その理由は、文字列

grep firefox

pattern firefoxと一致するが、文字列

grep [f]irefox

patternと一致しません[f]irefox(pattern と同等firefoxです)。

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


これは私の頭をさらに傷つけます
ピチコス14
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.