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

时间:2020-06-16 15:23:35

标签: json jq

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

{
  "data": [
    {
      "time": 20201606,
      "event": {
        "ip": "127.0.1",
        "hostname": "srv1",
        "locations": [
          "UK",
          "site1"
        ],
        "num": 1
      }
    },
    {
      "time": 202016034,
      "event": {
        "ip": "127.0.2",
        "hostname": "srv2",
        "locations": [
          "UK",
          "site2"
        ],
        "num": 3
      }
    }
  ]
}

就像生成此输出“ num,ip,主机名,位置”一样:

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

如何通过jq打印此内容?

2 个答案:

答案 0 :(得分:3)

用逗号连接位置,并将结果与​​其他字段一起放入数组。然后再加一个逗号和一个空格,以得到所需的输出格式。例如:

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

在命令行调用中使用--raw-output / -r选项来获取原始字符串而不是JSON字符串。

Online demo

答案 1 :(得分:1)

您想构建一个由所需值组成的数组:

$ jq '.data[].event | [.num, .hostame, .ip, .locations]' tmp.json
[
  1,
  null,
  "127.0.1",
  [
    "UK",
    "site1"
  ]
]
[
  3,
  null,
  "127.0.2",
  [
    "UK",
    "site2"
  ]
]

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

$ jq '.data[].event | [.num, .hostame, .ip, (.locations|join(","))]' tmp.json
[
  1,
  null,
  "127.0.1",
  "UK,site1"
]
[
  3,
  null,
  "127.0.2",
  "UK,site2"
]

接下来,让我们将那些字符串连接到一个", "分隔的字符串中。

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

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

$ jq -r '.data[].event | [.num, .hostame, .ip, (.locations|join(","))] | join(", ")' tmp.json
1, , 127.0.1, UK,site1
3, , 127.0.2, UK,site2