使用 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 分隔字符串的常用方法是什么。但是通过一些额外的逻辑,我们可以使用 sed
和 tr
实用程序获得所需的输出。
使用 @tsv
让 yq 创建一个制表符分隔值,然后我们使用一些常见的 shell 实用程序将其转换为所需的输出
sed G
每行后换行
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
非常适合我。无论如何,感谢您的回答和评论!
我有一个 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 分隔字符串的常用方法是什么。但是通过一些额外的逻辑,我们可以使用 sed
和 tr
实用程序获得所需的输出。
使用 @tsv
让 yq 创建一个制表符分隔值,然后我们使用一些常见的 shell 实用程序将其转换为所需的输出
sed G
每行后换行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
非常适合我。无论如何,感谢您的回答和评论!