我需要使用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打印此?
.data[].event | [
.num,
.hostname,
.ip,
(.locations | join(",")) ?
] | join(", ")
在命令行调用中使用--raw-output
/-r
选项来获取原始字符串而不是JSON字符串。
$ 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