使用 yq 遍历 Almquist 中的列表 shell

Using yq to traverse a list in Almquist shell

我有一个 YAML 文件示例,它在每个容器的 'containers' 列表和 'networks' 列表中包含可变数量的元素。

lab_name: practica0
containers:
- name: vm1
  image: rys
  networks:
  - 1
- name: router
  image: rys
  networks:
  - 1
  - 2
- name: vm2
  image: rys
  networks:
  - 2

我想遍历 'containers' 和 'networks' 数组以获取所有值,但我不知道具体该怎么做。我尝试使用 for 循环和 shell 变量,例如 yq eval '.containers[$i].name' example.yaml,但没有用。我尝试将 $i 括在双引号之间并按照此处指定的方式转义它们 https://github.com/mikefarah/yq/issues/468#issuecomment-752114840,但仍然没有成功。顺便说一句,我正在使用 Go yq,我必须使用 Almquist Shell 而不是 bash,所以我不能使用 readarray 之类的东西。谢谢

编辑:例如,我想要的输出会像这样简单:

vm1
rys
1

router
rys
1
2

vm2
rys
2

你可以使用像

这样的东西
yq e '.containers | map([ .name, .image, .networks[] ])' input

创建您想要的值列表:

- - vm1
  - rys
  - 1
- - router
  - rys
  - 1
  - 2
- - vm2
  - rys
  - 2

不确定将其转换为 new-line 分隔字符串的常用方法是什么。但是通过一些额外的逻辑,我们可以使用 sedtr 实用程序获得所需的输出。

使用 @tsv 让 yq 创建一个制表符分隔值,然后我们使用一些常见的 shell 实用程序将其转换为所需的输出

  1. sed G 每行后换行
  2. tr '\t' '\n' 用另一个换行符替换制表符
yq e '.containers | map([ .name, .image, .networks[] ]) | @tsv' input | sed G | tr '\t' '\n'
vm1
rys
1

router
rys
1
2

vm2
rys
2

我找到了一个更简单的解决方案:我没有像我应该的那样在变量周围使用引号。 yq eval '.containers['"$i"'].name' example.yaml 非常适合我。无论如何,感谢您的回答和评论!