Bash: Grep 正規表現が機能しない

Bash: Grep 正規表現が機能しない

次のように使用する場合grep:

ps aux | grep 'processname' | awk '{print $2}'

プロセスPIDsprocessname返されます。これを使用する場合:

ps aux | grep '^processname' | awk '{print $2}'

コマンドラインが で始まるプロセスを取得しようとしていますprocessnameが、うまくいきません。

実行中のプロセスの例:

processname
other_processname

はコマンドの開始なのでPID、最初のオプションの を取得したいと思います。processname

フラグの使用も試してみましたが-E, -e, -w、すべて同じ結果が返されます。何が間違っているのでしょうか?

答え1

^フィールドではなく行の開始を示します。

ps aux | grep ' processname'

より近づきますが、それでも誤検知が出る可能性があります。

他の列の幅は固定されているので、

grep '^.\{65\}processname'

ここでは、^.\{65\}行の先頭からちょうど 65 文字です。正確な数はシステムによって異なる場合があります。

すでに awk を使用している場合は、おそらくこれがより良いオプションになります。

ps aux | awk '{ if ($11 == "processname") print $2 }'

grep を簡単にするために、ps の出力を再フォーマットすることもできます。

ps ax -o pid,args | grep '^[^ ]\+ processname'

このスイッチ-o pid,argsにより、ps は PID と引数付きのコマンドのみを表示します。この式は、^[^ ]\+行の先頭から最初のスペースまでのすべての文字と一致します。

関連情報