私は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
どうして?ガイドを読みましたが、わかりません。
ここには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
最初のケースでは、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番目のプロセスは一致しません。
まず、grep --color=auto Thunderbird
がプロセステーブルに表示されるかどうか、したがってps
の出力に表示されるかどうかは、時間に依存します。つまり、システムのビジー状態とps
同時に開始されたプロセステーブルを解析することにより、この場合はgrep
。これは非常にまれなケースですが、grep
の出力にps
が表示されると想定できます。
現在、[]
は、(他のトークンが後に続かない場合)[]
内の文字のいずれかに一致することを意味するgrep構文です。したがって、grep '[t]hunderbird'
を使用する場合、grep
は[t]
をt
のみに一致するように処理し、結果として出力に表示されません。
grep Thunderbird
を使用しているときに、プロセステーブルでうまく行けば、同じもの(つまりgrep Thunderbird
)に対してgrep
- pingであるため、出力にgrep
プロセスが見つかります。
また、grep
はgrep --color=auto
のエイリアスであり、出力にも表示されることに注意してください。
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を作成します。