jq:使用上下文对象作为根查询中的键
jq: Use context object as key in query from root
我有一个 JSON 对象,其中相关部分的形式为
{
"_meta": {
"hostvars": {
"name_1": {
"ansible_host": "10.0.0.1"
},
"name_2": {
"ansible_host": "10.0.0.2"
},
"name_3": {
"ansible_host": "10.0.0.3"
}
}
},
...
"nodes": {
"hosts": [
"name_1",
"name_2"
]
}
}
(ansible-inventory --list
的输出,供参考)
我想使用 jq
通过查找 ._meta.hostvars
中的名称来生成 nodes
主机的 IP 列表。在示例中,输出应为:
10.0.0.1
10.0.0.2
请注意,不应包含 10.0.0.3
,因为 name_3
不在 .nodes.hosts
列表中。所以只做 jq -r '._meta.hostvars[].ansible_host'
是行不通的。
我试过 jq '.nodes.hosts[] | ._meta.hostvars[.].ansible_host'
但失败了,因为 ._meta
没有从管道后的根开始扫描。
您可以在更改上下文之前将根存储在变量中:
jq -r '. as $root | .nodes.hosts[] | $root._meta.hostvars[.].ansible_host'
但更好的解决方案是直接内联“主机”查询:
jq -r '._meta.hostvars[.nodes.hosts[]].ansible_host'
我有一个 JSON 对象,其中相关部分的形式为
{
"_meta": {
"hostvars": {
"name_1": {
"ansible_host": "10.0.0.1"
},
"name_2": {
"ansible_host": "10.0.0.2"
},
"name_3": {
"ansible_host": "10.0.0.3"
}
}
},
...
"nodes": {
"hosts": [
"name_1",
"name_2"
]
}
}
(ansible-inventory --list
的输出,供参考)
我想使用 jq
通过查找 ._meta.hostvars
中的名称来生成 nodes
主机的 IP 列表。在示例中,输出应为:
10.0.0.1
10.0.0.2
请注意,不应包含 10.0.0.3
,因为 name_3
不在 .nodes.hosts
列表中。所以只做 jq -r '._meta.hostvars[].ansible_host'
是行不通的。
我试过 jq '.nodes.hosts[] | ._meta.hostvars[.].ansible_host'
但失败了,因为 ._meta
没有从管道后的根开始扫描。
您可以在更改上下文之前将根存储在变量中:
jq -r '. as $root | .nodes.hosts[] | $root._meta.hostvars[.].ansible_host'
但更好的解决方案是直接内联“主机”查询:
jq -r '._meta.hostvars[.nodes.hosts[]].ansible_host'