【问题标题】:Using yq to traverse a list in Almquist shell使用 yq 遍历 Almquist shell 中的列表
【发布时间】:2022-01-26 16:26:33
【问题描述】:

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

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

我想遍历“容器”和“网络”数组来获取所有值,但我不知道具体该怎么做。我尝试使用 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

【问题讨论】:

  • 您的 yaml 缩进不正确,能否请您 edit 解决这个问题?
  • 糟糕,抱歉,我相信它现在已修复。谢谢
  • 是的,您能否也添加所需的输出?
  • 完成,我添加了一个非常简单的示例来说明我想要的。
  • 所以你想要原始字符串输出,没有 yaml?

标签: yaml sh yq


【解决方案1】:

你可以使用类似的东西

yq e '.containers | map([ .name, .image, .networks[] ])' input

创建您想要的值列表:

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

不确定将其转换为换行符分隔字符串的首选方法是什么。但是通过一些额外的逻辑,我们可以使用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 ... | while IFS= read -r name image networks; for network in $networks; do echo "name" "$name" "image" "$image" "network" "$network"; done; doneIFS='(tab)' 如果值可能包含空格但不包含制表符,并且您使用制表符作为分隔符。
  • jq 有join("\n")。结合--raw-output/-r,您没有字符串的 JSON 引用。也许 yq 有类似的东西?
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-02-10
    • 1970-01-01
    • 2022-12-02
    • 2016-11-26
    • 1970-01-01
    • 2018-05-22
    • 2017-06-15
    • 2020-09-07
    相关资源
    最近更新 更多