使用 jq:仅 select parents 带有某个 child 键
Using jq: Only select parents with a certain child key
示例json:
{
"version": "3",
"services": {
"web": {
"build": "web"
},
"redis": {
"image": "redis"
},
"datadog": {
"build": "datadog"
},
"another": {
"image": "mysql"
}
}
}
我想要 return 具有 "build" 键而不是 "image" 键的服务列表。请注意,构建密钥的值不是我可以关闭的值。
输出应为:["web"、"datadog"]
这里有两种工作方式:
1.
jq '.services
| . as $services
| keys_unsorted
| map( select($services[.] | has("build")) )'
(向下钻取.services
,记为$services
以备后用,得到key列表,select使得[=13中对应的值=] 有一个 build
键)。
2.
jq '.services
| to_entries
| map( select(.value | has("build")) | .key)'
(向下钻取到 .services
,转换为 {"key": ..., "value": ...}
对象的列表,select .value
具有 build
键的对象,和 return 每个 .key
)。
第二个可能更符合地道的 jq,但第一个也提供了一种有趣的思考问题的方式。
这是第三种方法,以忽略上游而著称:
[(paths(scalars)
| select(.[-1] == "build")) as $p
| getpath($p)]
示例json:
{
"version": "3",
"services": {
"web": {
"build": "web"
},
"redis": {
"image": "redis"
},
"datadog": {
"build": "datadog"
},
"another": {
"image": "mysql"
}
}
}
我想要 return 具有 "build" 键而不是 "image" 键的服务列表。请注意,构建密钥的值不是我可以关闭的值。
输出应为:["web"、"datadog"]
这里有两种工作方式:
1.
jq '.services
| . as $services
| keys_unsorted
| map( select($services[.] | has("build")) )'
(向下钻取.services
,记为$services
以备后用,得到key列表,select使得[=13中对应的值=] 有一个 build
键)。
2.
jq '.services
| to_entries
| map( select(.value | has("build")) | .key)'
(向下钻取到 .services
,转换为 {"key": ..., "value": ...}
对象的列表,select .value
具有 build
键的对象,和 return 每个 .key
)。
第二个可能更符合地道的 jq,但第一个也提供了一种有趣的思考问题的方式。
这是第三种方法,以忽略上游而著称:
[(paths(scalars)
| select(.[-1] == "build")) as $p
| getpath($p)]