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

问题描述 投票:-1回答:2

我需要使用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打印此?

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

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

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

Online demo


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" ]

接下来,让我们将

those字符串连接到", "分隔的字符串中。

$ 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

© www.soinside.com 2019 - 2024. All rights reserved.