如何将 `ps` 的输出解析到不同的字段?

如何将 `ps` 的输出解析到不同的字段?

我想解析ps, 的输出以使用 获取任何字段awk。看起来ps字段之间是用空格分隔的,但字段中的值COMMAND通常都有空格。

有没有办法告诉ps在其输出中使用一些独特的字段分隔符?我在联机帮助页中没有找到一个ps

如果没有,我该怎么做才能获取字段中的值?谢谢。

答案1

当使用格式字符串参数时,您可以显式指定您自己的字段分隔符打印()样式用户定义的输出:

$ ps -o '%p,%a,%c,%y'
  PID,COMMAND                    ,COMMAND        ,TTY
15742,ps -o %p,%a,%c,%y          ,ps             ,pts/6
24719,-su                        ,bash           ,pts/6

答案2

您可以首先将多个空格替换为单个空格(或任何其他字符)。看这个问题关于如何实现这一点。接下来,您可以使用它cut来选择所需的列。也可以看看这个问题

答案3

您可以利用 shellread将所有剩余字段放入最后一个变量并最后打印 COMMAND 的事实。

ps -eo pid,cmd,tty,args | while read PID CMD TTY ARG; do echo $PID $CMD $TTY $ARG; done

直接读取输出时,您可以传送$ARGto awk,或者连接$4... $NFinsideawkps

答案4

您可以将所有内容填充到最大,然后将“大量空格”视为分隔符......并将其更改为管道或其他一些字符以更加理智。这是一个--format执行-f通常所做的事情,加上更改分隔符,并添加“标签”(-Z通常执行的操作),这是另一个可以包含空格的字段,表明简单地将它们移到末尾是不够的。

ps -e --format "label:200 uid:200 pid:200 ppid:200 c:200 stime:200 tty:200 time:200 command:200" \
    | sed -r 's| {100,}|\||g'

但也许这会产生副作用……我的机器上允许填充的限制 ps 似乎在 100 到 200 个空格之间;也许其他地方不一样。也许一个命令中有那么多空格。不能保证这永远有效。如果您需要保证(例如在无人值守的脚本中),您基本上必须重新实现 ps,例如自行查找/proc/[0-9]*以收集所有这些信息。

相关内容