列出每个具有父名称的特定元素
list each specific element with parent name
我有 json 个数组中的随机元素:
[
{
"system": {
"name": "sys1",
"interfaces": [
{
"ip": "1.1.1.1",
"ent": "ent1"
},
{
"ip": "2.2.2.2",
"ent": "ent0"
}
]
}
},
{
"system": {
"name": "sys2",
"interfaces": [
{
"ip": "3.3.3.3",
"ent": "ent0"
}
]
}
},
{
"system": {
"name": "sys3",
"interfaces": null
}
},
{
"system": {
"name": "sys4"
}
}
]
我需要使用 jq
获得以下输出:
sys1 1.1.1.1 ent1
sys1 2.2.2.2 ent0
sys2 3.3.3.3 ent0
我试过以下过滤器:
$ jq -r '.[]|[.system.name, .system.interfaces[].ip, .system.interfaces[].ent]|@tsv' test_json2
sys1 1.1.1.1 2.2.2.2 ent1 ent0
sys2 3.3.3.3 ent0
如何拆分第 1 行以达到预期结果?
更新:当数组为空时我遇到了新情况,现在我使用 pmf 的答案中的 filrer 得到以下错误:
jq: error (at test_json2:34): Cannot iterate over null (null)
在包含 .name
的数组外迭代。这样,每个迭代步骤都会生成另一个数组。
jq -r '.[].system | [.name] + (.interfaces[]? | [.[]]) | @tsv' test_json2
如果.interfaces
数组中的对象可以有不止这两个字段,但您只想输出这两个字段,请明确命名。
jq -r '.[].system | [.name] + (.interfaces[]? | [.ip, .ent]) | @tsv' test_json2
输出为:
sys1 1.1.1.1 ent1
sys1 2.2.2.2 ent0
sys2 3.3.3.3 ent0
您可以使用array
对每个接口进行分组。
.[] | .system | select(.name=="sys1" or .name=="sys2") | [.name] + (.interfaces[] | [.[]]) | @tsv
演示
https://jqplay.org/s/iucSZqkB1r
请注意 .[]
在一个对象上 returns 它的 values
。
我有 json 个数组中的随机元素:
[
{
"system": {
"name": "sys1",
"interfaces": [
{
"ip": "1.1.1.1",
"ent": "ent1"
},
{
"ip": "2.2.2.2",
"ent": "ent0"
}
]
}
},
{
"system": {
"name": "sys2",
"interfaces": [
{
"ip": "3.3.3.3",
"ent": "ent0"
}
]
}
},
{
"system": {
"name": "sys3",
"interfaces": null
}
},
{
"system": {
"name": "sys4"
}
}
]
我需要使用 jq
获得以下输出:
sys1 1.1.1.1 ent1
sys1 2.2.2.2 ent0
sys2 3.3.3.3 ent0
我试过以下过滤器:
$ jq -r '.[]|[.system.name, .system.interfaces[].ip, .system.interfaces[].ent]|@tsv' test_json2
sys1 1.1.1.1 2.2.2.2 ent1 ent0
sys2 3.3.3.3 ent0
如何拆分第 1 行以达到预期结果?
更新:当数组为空时我遇到了新情况,现在我使用 pmf 的答案中的 filrer 得到以下错误:
jq: error (at test_json2:34): Cannot iterate over null (null)
在包含 .name
的数组外迭代。这样,每个迭代步骤都会生成另一个数组。
jq -r '.[].system | [.name] + (.interfaces[]? | [.[]]) | @tsv' test_json2
如果.interfaces
数组中的对象可以有不止这两个字段,但您只想输出这两个字段,请明确命名。
jq -r '.[].system | [.name] + (.interfaces[]? | [.ip, .ent]) | @tsv' test_json2
输出为:
sys1 1.1.1.1 ent1
sys1 2.2.2.2 ent0
sys2 3.3.3.3 ent0
您可以使用array
对每个接口进行分组。
.[] | .system | select(.name=="sys1" or .name=="sys2") | [.name] + (.interfaces[] | [.[]]) | @tsv
演示
https://jqplay.org/s/iucSZqkB1r
请注意 .[]
在一个对象上 returns 它的 values
。