打印对象中不同条目的键和值

问题描述 投票:0回答:2

我需要使用jq打印一些结果以获取json。这是一个例子:

{
  "time": 20201606,
  "event": {
    "ip": "127.0.1",
    "hostname": "srv1",
    "locations": [
      "UK",
      "site1"
    ],
    "num": 1
  }
}

类似于生成此输出“ num,ip,主机名,位置”:

1, srv1, 127.0.1, UK,site1
2, srv2, 127.0.2, HK,site2
3, srv3, 127.0.3, LO,site3

如何通过jq打印此?

json jq
2个回答
2
投票

用逗号联接位置,然后将结果与其他字段一起放入数组,并再次使用联接(以逗号分隔,后跟一个空格)以得到所需的结果。例如:

.event | [
  .num,
  .hostname,
  .ip,
 (.locations | join(","))
] |  join(", ")

注意,这假设您具有这些对象的流,而不是数组。

Online demo


0
投票

其核心是要构建一个包含所需值的数组:

$ jq '.event | [.num, .hostame, .ip, .locations]' tmp.json
[
  1,
  "srv1",
  "127.0.1",
  [
    "UK",
    "site1"
  ]
]

从那里开始,是格式化的问题。首先,让我们将位置列表转换为单个字符串:

$ jq '.event | [.num, .hostame, .ip, (.locations|join(","))]' tmp.json
[
  1,
  "srv1",
  "127.0.1",
  "UK,site1"
]

接下来,让我们将those字符串连接到", "分隔的字符串中。

$ jq '.event | [.num, .hostame, .ip, (.locations|join(","))] | join(", ")' tmp.json
"1, srv1, 127.0.1, UK,site1"

最后,您可以使用-r标志输出原始文本,而不是JSON字符串值。

$ jq -r '.event | [.num, .hostame, .ip, (.locations|join(","))] | join(", ")' tmp.json
1, srv1, 127.0.1, UK,site1
© www.soinside.com 2019 - 2024. All rights reserved.