将Bash输出转换为JSON

3
我正在运行以下命令:
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"}

我似乎无法正确输入引号而不影响我的输出。

你能否提供一个 clustat 输出的例子,这样大家就可以编写和测试替代你 awk 脚本的潜在不同语言的代码了吗? - Charles Duffy
“添加字面引号很容易,但处理正确的JSON引用的所有其他方面——将"更改为\",或将任何字面反斜杠加倍,等等是不同的问题;强大的方法是使用具有本地JSON生成支持的语言。” - Charles Duffy
并不是说,我建议使用awk来完成这项工作 - jq 才是非常正确的工具。 - Charles Duffy
这是没有我的附加功能的输出: 服务:服务名称 服务器名称 已启动
服务:服务名称 服务器名称 已启动
服务:服务名称 服务器名称 已启动
服务:服务名称 服务器名称 已启动
服务:服务名称 服务器名称 已启动
- h.b
请将其编辑到问题中--这样可以保留换行符等。 - Charles Duffy
显示剩余4条评论
3个回答

8

使用 jq

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

输入被视为原始文本,而非 JSON 格式。每行内容会被空格分隔 (需要根据实际输入情况调整 split 参数)。jq 会确保构建输出对象时数值被正确引用。

可以通过在过滤器中使用select(test("primary"))来将grep移入jq - Charles Duffy

2
不要这样做:相反,请使用@chepner的答案,它保证生成有效的JSON输出并处理所有可能的输入(或者在无法生成JSON表示时失败并返回非零退出状态)。
下面的内容仅经过特定输入的测试,可以生成有效的JSON,并且几乎肯定会生成输出,其中包含许多可能的输入(包括带有文字引号的字符串,以文字反斜杠结尾的字符串等),但不是有效的JSON。
sudo clustat |
  awk '/primary/ {
         print "{\"service\":\"" $1 "\",\"server\":\"" $2 "\",\"status\":\""$3"\"}"
       }' 

我将您给我的代码与以下内容结合使用,并获得了所需的输出。非常感谢!sudo clustat | grep primary | awk '{print "{"service":"" $1 "","server":"" $2 "","status":""$3""}"}' - h.b
1
叹气。很少会因为被接受的答案而感到失望。(我写这个实际上是为了防止其他潜在的答案给出不良实践但对于受限输入来说是正确的方法,而不是希望它被真正采纳)。 - Charles Duffy

1
对于常见shell命令的JSON转换,一个不错的选择是jc(JSON Convert)
但目前还没有clustat的解析器。 clustat输出看起来像表格,因此您可以尝试使用--asciitable解析器jc一起使用。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接