我需要使用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打印此?
用逗号联接位置,然后将结果与其他字段一起放入数组,并再次使用联接(以逗号分隔,后跟一个空格)以得到所需的结果。例如:
.event | [
.num,
.hostname,
.ip,
(.locations | join(","))
] | join(", ")
注意,这假设您具有这些对象的流,而不是数组。
其核心是要构建一个包含所需值的数组:
$ 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