将 ps aux 转换为 json



我尝试在不使用Perl或Python的情况下将ps aux的输出转换为Json格式!对于这些,我已经阅读了有关jq的信息。但是我成功地将命令行输出转换为json。

如何将简单ps aux转换为 Json?

 ps aux | awk '
BEGIN { ORS = ""; print " [ "}
{ printf "%s{"user": "%s", "pid": "%s", "cpu": "%s"}",
      separator, $1, $2, $3
  separator = ", "
}
END { print " ] " }';

只需从 ps aux 输出中调整您需要的列。

jq可以读取非JSON输入。您需要先使用awk预处理输入:

ps aux |
  awk -v OFS=, '{print $1, $2}' | 
  jq -R 'split(",") | {user: .[0], pid: .[1]}'

如果需要数组而不是对象序列,请通过 jq --slurp 'add' 管道传输输出。(我发誓有一种方法可以在没有额外呼叫jq的情况下做到这一点,但目前它逃脱了我。

这是一个基于标记化的 only-jq 解决方案。

令牌化可以使用以下方法完成:

def tokens:
  def trim: sub("^ +";"") |  sub(" +$";"");
  trim | splits(" +");

为了说明和简洁起见,我们只考虑前 10 个令牌:

[tokens] | .[0:9]

调用:

$ ps aux | jq -c -R  -f tokens.jq 

或者作为单行,您可以侥幸逃脱:

$  ps aux | jq -cR '[splits(" +")] | .[0:9]'

输出的前几行:

["USER","PID","%CPU","%MEM","VSZ","RSS","TT","STAT","STARTED"]
["p","1595","55.9","0.4","2593756","32832","??","R","24Jan17"]
["p","12472","26.6","12.6","4951848","1058864","??","R","Sat01AM"]
["p","13239","10.9","1.5","4073756","128324","??","R","Sun12AM"]
["p","12482","7.8","1.2","3876628","101736","??","R","Sat01AM"]
["p","32039","7.7","1.4","4786968","118424","??","R","12Feb17"]
["_windowserver","425","7.6","0.8","3445536","65052","??","Ss","24Jan17"]

使用标头作为对象键

参见例如https://github.com/stedolan/jq/wiki/Cookbook#convert-a-csv-file-with-headers-to-json

我有一个要点可以将ps输出转换为json。 它在幕后使用 jq,因此您需要安装它。但是你不需要知道 jq

将 -o 标志指定的字段转储为 PID 对象数组:

ps ax -o "stat,euid,ruid,tty,tpgid,sess,pgrp,ppid,pid,wchan,sz,pcpu,command" 
    | jq -sRr ' sub("n$";"") | split("n") | ([.[0]|splits(" +")]) as $header | .[1:] | [.[] | [. as $x | range($header|length) | {"key": $header[.], "value": (if .==($header|length-1) then ([$x|splits(" +")][.:]|join(" ")|tojson|.[1:length-1]) else ([$x|splits(" +")][.]) end) } ] | from_entries]'

这将生成标头字段的数组,映射每个输出对象的 {key, value} 对象数组,然后使用内置的 from_entries 筛选器将这些对象聚合到输出中。

最新更新