grepで最初の一致を取得する方法は?

grepで最初の一致を取得する方法は?

スクリプトを作成して変数として使用しています。

RESULT1=`ps -ef | grep -w "PHANTOM PHA-WRM-EXPIRE"`.

ps2つのPIDが一覧表示されます。

[xhobando@noitu TNOITU]$ ps -ef | grep -w "/usr/ud/bin/udt PHANTOM PHA-WRM-EXPIRE"
phantomxg      7250     1  0 12:15 ?        00:00:01 /usr/ud/bin/udt PHANTOM PHA-WRM-EXPIRE

phantomxg    17071     1  0 Oct04 ?        00:05:27 /usr/ud/bin/udt PHANTOM PHA-WRM-EXPIRE

ここで達成したいのは、両方のgrepオプションではなく、最初のPIDのみを見つけることです。

これが意味があるかどうか教えてください。

ベストアンサー1

PCREサポートでGNUを使用するgrep(rhelで実装):

ps -Ao pid= -o args= |
  grep -Pom1 '^\s*\K\d+(?= \Q/usr/ud/bin/udt PHANTOM PHA-WRM-EXPIRE\E)'

どこ

  • -PPerlに似た正規表現に切り替えます(\s、、、、、、、すべてのPerlに似た拡張の場合)。\K\d(?=...)\Q\E
  • -ogrep一致する部分だけを出力するように指示します。
  • -m1grep一致する最初の行のみを出力するように指示します。

(3つのフラグはすべてGNU拡張ですが、GNUはRHELで見つかった実装grepです。)grep

ps -f気にしないいくつかのフィールドを印刷するのではなく、必要なフィールドだけを選択し(サフィックスpidはヘッダーを削除する)、コマンドラインでより簡単に一致させることができます。args=

ここで正規表現は、^ゼロ個以上の ( *) 空白文字 ( ) で構成される一連の先行 ( ) を探し、一致の始まりを表示し ( )、その後に\s1 つ以上の ( ) 数字で\K構成されるシーケンス ( ) を探します。シーケンスの後には、スペースと希望の引数(正規表現演算子のリストを含めることができる他の引数に置き換えるのを容易にするために引用)が続きます(一致の一部ではないプレビュー演算子)。+\d(?=...)\Q\E

または単に使用してくださいpgrep

pgrep -f '^/usr/ud/bin/udt PHANTOM PHA-WRM-EXPIRE' | head -n 1

引数リスト(空白文字で連結)が始まる最初のプロセスのpidを返します/usr/ud/bin/udt PHANTOM PHA-WRM-EXPIRE

psプロセスは、またはデフォルトで出力のpidに基づいて数値順にソートされます。pidpgrep数値は最大値に達すると改行されるため、取得される数値は多少ランダムです。

--sort start_timeたとえば、--sort -start_time開始ps 時間で並べ替えたり、-o/を追加したりできます。-n最も古い/最新情報そしてpgrep削除| head -n 1)最新の起動プロセスであることを保証する代わりに、最も早い/最近起動されたプロセスを取得したい場合処刑されたudt最初/最後のプロセスは、寿命の間に複数のコマンドを実行でき、しばしば実行します。

質問に対するご意見からわかるように、現在の作業ディレクトリに基づいてプロセスを選択するには、次のzsh方法を使用できます。

pids=(
  /proc/<1->(e[$'[[ $REPLY/cwd -ef /tdata/PHANTOM &&
    $(<$REPLY/cmdline) = /usr/ud/bin/udt\0PHANTOM\0PHA-WRM-EXPIRE\0* ]]']:t)
)

ここで、最初の3つの引数で、/tdata/PHANTOMおよびがあるプロセスを探します。/usr/ud/bin/udtPHANTOMPHA-WRM-EXPIRE

ただし、プロセスにスーパーユーザー権限がない場合は、自分のプロセスの作業ディレクトリのみを見つけることができます。

おすすめ記事