我想解析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
答案3
您可以利用 shellread
将所有剩余字段放入最后一个变量并最后打印 COMMAND 的事实。
ps -eo pid,cmd,tty,args | while read PID CMD TTY ARG; do echo $PID $CMD $TTY $ARG; done
直接读取输出时,您可以传送$ARG
to awk
,或者连接$4
... $NF
insideawk
ps
答案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]*
以收集所有这些信息。