コマンドawk |実行方法

コマンドawk |実行方法

ps ax | grep apache | awk '{ print "cat /proc/"$1"/status | grep State" }' そのため、次のような結果を出力するこのコマンドがあります。

cat /proc/9989/status | grep State 
cat /proc/9992/status | grep State 
cat /proc/9993/status | grep State 
cat /proc/9994/status | grep State 

しかし、私は一歩進んで、これらのことを実行したいと思います。そのため、awkコマンドの出力を実行した後に何かが欠落しています。似て| execいるか似ているもの。

可能ですか?

答え1

正規表現+パラメータ方法:

pgrep apache | xargs -I {} grep State "/proc/{}/status"

サンプル出力は次のとおりです。

State:  S (sleeping)
State:  S (sleeping)

答え2

現在実行中のインスタンスの現在の状態だけを知ることで、apache多くの問題をスキップできます。

あなたはそれを使用することができます

$ pgrep apache | xargs -n 1 ps -o pid=,state= -p
12206 S
12821 S
12872 S
12873 S
13084 S

pgrepこれは、実行中のすべてのプロセスのすべてのPIDを取得してapacheそれを提供するためにxargs使用され、指定されたPIDの状態をxargs照会psし、PIDのリストと現在の状態を返します。

最後に=、列見出しは印刷されませんpid=state=

単一文字の状態意味のリストについては、psシステムのマニュアルを確認してください。


上記のコマンドは、/procステータス情報が異なる場合がありますが、Linuxファイルシステムを持たないUniceにも移植可能です。これはテストのためにOpenBSDでapache置き換えられましたksh

$ pgrep ksh | xargs -n 1 ps -opid=,state= -p
22007 INsp
94426 IN+p
46726 INsp
70684 INsp
 5224 INsp
 9116 SNsp

答え3

「exec」の代わりに必要なコマンドは「sh」です。あなたのawkプログラムはシェルスクリプトを出力しているので、それをシェルに入力するだけです!

あなたがあまりにも多くのことをしていることを示唆する他の答えは正しいです。たとえば、awkは入力をフィルタリングできるため、grepとawkは必要ありません。

答え4

icarusが正しく言ったように、コマンドをシェルにパイプするだけでなく、シェルコマンドawk自体を実行することもできます。

  ps ax | grep apache | awk '{ system("cat /proc/"$1"/status | grep State") }' 

catしかし、RomanPerekhrestが静かに見せたようにgrepファイルを読み取ることができるので、そうする必要はありません。

  ps ax | grep apache | awk '{ system("grep State /proc/"$1"/status") }' 

そして、2番目のファイルは必要ありません。ファイルを読み取って正規表現と一致させることができるgrepからです。awk

 ps ax | grep apache | awk '{F="/proc"$1"/status"; 
      while((getline <F)>0) if(/State/) print; close(F)}'
 # if maxfiles is enough you don't need the close(F)

最初ではありません。

 ps ax | awk '/apache/{F="/proc"$1"/status"; 
      while((getline <F)>0) if(/State/) print; close(F)}'
 # ditto

ただし、省略形ですが、状態がすでに出力されているため、/proc実際に見る必要はありません。ps

 ps ax | awk '/apache/{print $3}'
 # or print $1,$3 to include PID like Kusalananda's ps-based answer
 # or better check $5~/apache/ to avoid including processes that 
 # aren't _running_ apache but have apache in their _arguments_ 

関連情報