将bash输出转换为JSON

时间:2016-09-26 15:54:06

标签: json bash awk sed

我正在运行以下命令:

sudo clustat | grep primary | awk 'NF{print $1",""server:"$2 ",""status:"$3}'

结果是:

service:servicename,server:servername,status:started
service:servicename,server:servername,status:started
service:servicename,server:servername,status:started
service:servicename,server:servername,status:started
service:servicename,server:servername,status:started

我想要的结果是:

{"service":"servicename","server":"servername","status":"started"}
{"service":"servicename","server":"servername","status":"started"}
{"service":"servicename","server":"servername","status":"started"}
{"service":"servicename","server":"servername","status":"started"}
{"service":"servicename","server":"servername","status":"started"}

我似乎无法在我的输出中加上qoutation标记。

2 个答案:

答案 0 :(得分:3)

使用jq

sudo clustat | grep primary |
  jq -R 'split(" ")|{service:.[0], server:.[1], status:.[2]}'

输入读取为原始文本,而不是JSON。每一行都在一个空格上分开(split的参数可能需要根据实际输入进行调整)。 jq确保在构造输出对象时正确引用值。

答案 1 :(得分:1)

不要这样做:相反,使用@chepner's answer,保证生成有效的JSON作为输出和所有可能的输入(如果没有JSON表示,则失败并返回非零退出状态)。

下面只测试生成有问题的特定输入的有效JSON,并且肯定会产生不是有效JSON的输出,其中有许多可能的输入(带有文字引号的字符串,字符串)以字面反斜杠结尾等)。

sudo clustat |
  awk '/primary/ {
         print "{\"service\":\"" $1 "\",\"server\":\"" $2 "\",\"status\":\""$3"\"}"
       }'