Yaml 根据子对象中存在的关键点返回顶级关键点

Yaml 根据子对象中存在的关键点返回顶级关键点,yaml,yq,Yaml,Yq,我有一个像这样的YAML文件 --- 会员资格: 儿童: 普罗米修斯: 儿童: 第一组: 第2组: 应用程序日志存储: 儿童: 第3组: 第4组: 应用程序管理器: 儿童: 第一组: 第2组: 当我查找vm时,我尝试获取组,例如,我查找我想要获取的组1 apps_prometheus apps_alertmanager 我正在尝试使用map/key/contains和jq的组合 -----使用路径命令进行测试 如果我使用命令 yq-r'.apps_membership.children|pa

我有一个像这样的YAML文件

---
会员资格:
儿童:
普罗米修斯:
儿童:
第一组:
第2组:
应用程序日志存储:
儿童:
第3组:
第4组:
应用程序管理器:
儿童:
第一组:
第2组:
当我查找vm时,我尝试获取组,例如,我查找我想要获取的组1

apps_prometheus
apps_alertmanager
我正在尝试使用map/key/contains和jq的组合

-----使用路径命令进行测试

如果我使用命令
yq-r'.apps_membership.children|path'
我得到这个结果:

[
  "apps_prometheus"
]
[
  "apps_prometheus",
  "children"
]
[
  "apps_logstash"
]
[
  "apps_logstash",
  "children"
]
[
  "apps_alertmanager"
]
[
  "apps_alertmanager",
  "children"
]
如果我把yaml换成

    apps_alertmanager:
      children:
        group_1: ""
        group_2: ""
我得到了期望的输出:

[
  "apps_alertmanager"
]
[
  "apps_alertmanager",
  "children"
]
[
  "apps_alertmanager",
  "children",
  "group_1"
]
[
  "apps_alertmanager",
  "children",
  "group_2"
]
如何使用命令路径也获取空值?

在中,您可以使用
jq
中提供的
path
功能来筛选密钥名称

yq-r'.apps_membership.children | path | select(.[-1]=“group_1”)[0]'

你们有什么版本的
yq
?发布
yq--version
的输出并发布完整的YAML文件yq version:yq 2.12.0和jq version:jq-1.5-1-a5b5cbe我截断了文件的其余部分,因为YAML总是相同的then@Inian,我刚刚在ubuntu版本上测试了paths命令,效果很好。。。。看起来debian buster出现了问题…谢谢你的回答,但它没有返回值,当我只使用路径时,它不会进入组键的最后一级。,它在children Onessory上停止,但我在一个新安装了jq+yq的虚拟机上再次尝试,我没有得到这个命令的结果,我提供的测试yaml:/看起来路径直到最后一级才运行,如果我用children替换你命令上的group_1,我会得到一个结果该命令在linux mint 19上不起作用,但是升级到20会…@lotusnoir:我怀疑这和你的Linux版本有什么关系。检查您的
jq
yq
版本。如果答案对你有帮助,也请投票