如何从 YAML 文件中提取一些 IP 地址

Jac*_*son 3 yaml

我有这个文件,如果没有注释该行,我想选择该masters/hosts部分下的所有 IP 地址。我尝试过这个,但没有成功。sed 's/.*\ \([0-9\.]\+\).*/\1/g'

metal:
  children:
    masters:
      hosts:
        dev0: {ansible_host: 172.168.1.10}
        # dev1: {ansible_host: 185.168.1.11}
        # dev2: {ansible_host: 142.168.1.12}
    workers:
      hosts: {}
        # dev3: {ansible_host: 172.168.1.13}

Run Code Online (Sandbox Code Playgroud)

A.B*_*A.B 14

与处理 JSON 的方式相同,在 shell 中使用适当的工具可以更好地处理:jq,如果有一个类似的 YAML 工具怎么办?

实际上有一个jq名为...的包装器yq,可以像 YAML 输入一样使用jq。它似乎没有打包在发行版中。无论如何,一旦构建并安装了这个 python 命令(以及jq广泛可用的强制工具),现在就可以相应地解析 YAML 文件,因为它自然会忽略注释。

yq -r '.metal.children.masters.hosts[].ansible_host' < myfile.yaml
Run Code Online (Sandbox Code Playgroud)

只要语法有效,它将转储 master 中的 IP 地址。

  • FWIW 还有[另一个名为 yq](https://mikefarah.gitbook.io/yq/) 的工具,其目的相同,但是完全不同的实现,独立于 jq。 (3认同)