命令 |查询 | 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获取所有正在运行的进程的所有 PIDapache并将它们提供给xargs.xargs将运行ps来查询给定 PID 的状态,并返回 PID 列表及其当前状态。

=末尾的pid=state=阻止打印该列的标题。

有关单字母状态含义的列表,请查看ps系统上的手册。


上述命令也可以移植到没有 Linux/proc文件系统的 Unices,尽管状态信息可能以不同的形式呈现。这是在 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 程序正在输出 shell 脚本,因此只需将其输入 shell 即可!

其他表明您做得太多的答案是正确的,例如您不需要 grep 和 awk,因为 awk 可以过滤它的输入。

答案4

除了像 icarus 正确所说的那样将命令通过管道传输到 shell 之外,awk还可以执行 shell 命令本身:

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

但你不需要,cat因为grep可以读取文件,如 RomanPerekhrest 悄悄显示的那样:

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

并且您不需要第二个,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_ 

相关内容