【问题标题】:Convert bash output to JSON将 bash 输出转换为 JSON
【发布时间】:2017-02-04 01:24:14
【问题描述】:

我正在运行以下命令:

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 脚本的替代品?
  • (添加文字引号很容易,但处理正确 JSON 引用的所有其他方面 - 将 " 更改为 \",或将任何文字反斜杠本身加倍,等等是另一回事;稳健的方法是使用支持原生 JSON 生成的语言)。
  • 仅供参考,awk /primary/ { ... } 会将grep primary 的效果合并到您的awk 脚本中。
  • ...不是,要清楚,我建议使用 awk 来完成这项工作——jq 是非常合适的工具。
  • 这是没有我的附加组件的输出: service:servicename servername started service:servicename servername started service:servicename servername started service:servicename servername started service:servicename servername started

标签: json bash awk sed


【解决方案1】:

使用jq:

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

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

【讨论】:

  • 可以通过在过滤器中使用select(test("primary"))grep 移动到jq
【解决方案2】:

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

以下内容仅经过测试以使用问题中显示的特定输入生成有效 JSON,并且肯定会生成 不是 具有许多可能输入的有效 JSON 输出(带有文字引号的字符串、字符串以文字反斜杠等结尾)。

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

【讨论】:

  • 我结合您给我的内容使用了以下内容,它具有所需的输出。谢谢!须藤集群 | grep 初级 | awk '{print "{\"service\":\"" $1 "\",\"server\":\"" $2 "\",\"status\":\""$3"\"}"} '
  • 叹息。我很少对被接受的答案感到失望。 (从字面上看,我写这篇文章是为了防止其他潜在的答案给出错误的做法,但对受约束的输入方法是正确的,而不是希望它会被实际采用)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多