web-dev-qa-db-ja.com

grepコマンドと[]

私はbashコードを学んでおり、今日はコマンドgrepを勉強しています。

私が走ったら

$ ps -fU user | grep Thunderbird

ターミナルショー:

user  17410     1  0 10:09 ?        00:00:20 /usr/lib/Thunderbird/thunderbird
user  18990 15896  0 12:25 pts/1    00:00:00 grep --color=auto Thunderbird

しかし、私が実行した場合:

$ ps -fU user | grep [t]hunderbird

ターミナルショー:

user  17410     1  0 10:09 ?        00:00:20 /usr/lib/Thunderbird/thunderbird

どうして?ガイドを読みましたが、わかりません。

10
linofex

ここには2つの問題があります。まず、ps | grep ...を実行すると、grepプロセスもpsの出力に表示されます。デフォルトのps出力には、プロセスの名前だけでなく、プロセスが起動された引数が含まれます。これは、grep fooを実行し、fooと呼ばれる実行中のプロセスがある場合、psと一致する2つのfoo結果があります:fooプロセスとgrepを検索しているため、foo自体。 ps -f | grep Thunderbirdを実行すると2行が表示されるのはこのためです。

現在、[ ]は、文字のリストである文字クラスを定義する正規表現の構造です。たとえば、[abc]aまたはbまたはcと一致します。 ps -f | grep [t]hunderbirdを実行すると、そのクラスには単一の文字のみが含まれるため、括弧なしのThunderbirdと同等です。ただし、grepプロセスは、Thunderbirdではなく、今回は[t]hunderbirdを引数として起動されました。したがって、psの出力の行には[t]hunderbirdが含まれます。次のようになります。

terdon   23101 10991  0 16:53 pts/3    00:00:00 grep --color [t]hunderbird

これは、Thunderbirdではなくps -f | grep Thunderbirdが含まれているため、[t]hunderbirdを実行したときに一致しないことを意味します。

これは、ps | grepの実行時にgrepプロセス自体との一致を回避するための一般的なトリックです。別の方法は、ps -f | grep foo | grep -v grepを実行してgrepを除外することです。ただし、最善のアプローチは、このために特別に設計されたプログラムpgrepを使用することです。

$ pgrep -l Thunderbird
11330 Thunderbird
14
terdon

最初のケースでは、Word Thunderbirdを使用したプロセスを探しています。2つのThunderbirdとgrepコマンド自体があります。

2番目では、t文字に続いてhunderbirdも探しています。[t]は、角括弧内のリストされた文字(文字tのみ)に一致するためです。 2つのプロセスが

user  17410     1  0 10:09 ?        00:00:20 /usr/lib/Thunderbird/thunderbird
user  18990 15896  0 12:25 pts/1    00:00:00 grep --color=auto [t]hunderbird

Rexep [t] hunderbirdはリテラル文字列[t]hunderbirdと一致しないため、2番目のプロセスは一致しません。

6
Robert Longson

まず、grep --color=auto Thunderbirdがプロセステーブルに表示されるかどうか、したがってpsの出力に表示されるかどうかは、時間に依存します。つまり、システムのビジー状態とps同時に開始されたプロセステーブルを解析することにより、この場合はgrep。これは非常にまれなケースですが、grepの出力にpsが表示されると想定できます。

現在、[]は、(他のトークンが後に続かない場合)[]内の文字のいずれかに一致することを意味するgrep構文です。したがって、grep '[t]hunderbird'を使用する場合、grep[t]tのみに一致するように処理し、結果として出力に表示されません。

grep Thunderbirdを使用しているときに、プロセステーブルでうまく行けば、同じもの(つまりgrep Thunderbird)に対してgrep- pingであるため、出力にgrepプロセスが見つかります。

また、grepgrep --color=autoのエイリアスであり、出力にも表示されることに注意してください。

3
heemayl

grepの[]は、文字の照合に使用されます。 grep [tb]all my_file.txtを取る場合

それは同等です

grep tall my_file.txt
grep ball my_file.txt

T + allを使用してgrepを実行し、次にb + allを使用してgrepを実行します。

たとえば、ファイル内でWord ABCまたはBBCを検索する場合は、次のgrepコマンドを使用できます。

grep [AB]BC file_name 

ここでは、[]がgrepになり、Aを使用してWordを展開し、次にBを使用してWordを展開し、ABCとBBCを作成します。

1
Bidyut