Yq:检索对象键名称

Pie*_*reF 2 shell yaml jq yq

我有一个 YAML 文件(在我的例子中是 docker-compose 文件),如下所示:

networks:
    foo:
      some_opts: "covfefe"
    bar:
      some_opts: "such wow"
services:
  apache:
    image: 'apache:1.0.0'
    restart: always
  mysql:
    image: 'mysql:1.0.0'
    restart: always
  php:
    image: 'php'
    restart: always
Run Code Online (Sandbox Code Playgroud)

我想提取服务名称感谢yq,相当于jq但对于 YAML,有这个输出:

"apache"
"mysql"
"php"
Run Code Online (Sandbox Code Playgroud)

目前我可以这样实现:

$ cat docker-compose.yml | yq '.services' | yq 'keys[]'
"apache"
"mysql"
"php"
Run Code Online (Sandbox Code Playgroud)

即使它有效,双管道yq对我来说也很奇怪。我想我做错了。

问题:有什么办法可以用一个yq命令来实现它吗?

我试过这个没有成功,从这个问题中获得灵感:

$ cat docker-compose.yml | yq '.services.keys[]'
jq: error: Cannot iterate over null
Run Code Online (Sandbox Code Playgroud)

Mos*_*ein 9

keys是一个内置函数,jq当给定一个对象时,在数组中返回它的键。所以它实际上并不是你的 yaml(不是属性)的一部分,这意味着你不能做services.keys.

要获取密钥,您可以执行以下操作:

我们将获得services第一部分中的对象,然后将其传递给keys它将基于给定对象返回键列表

cat docker-compose.yml | yq '.services | keys'
Run Code Online (Sandbox Code Playgroud)

或者像这样(没有 cat 和 pipe):

yq '.services | keys' docker-compose.yml
Run Code Online (Sandbox Code Playgroud)

输出将是:

[
  "apache",
  "mysql",
  "php"
]

Run Code Online (Sandbox Code Playgroud)

要摆脱括号:

yq '.services | keys[]' docker-compose.yml
Run Code Online (Sandbox Code Playgroud)

输出:

"apache"
"mysql"
"php"

Run Code Online (Sandbox Code Playgroud)

欲了解更多有关信息,您可以检查内建运算符和函数jq。请注意,这yq是一个包装器,jq因此文档jq将作为yq建议的帮助有所帮助。

  • 为了使其工作,我必须编写“yq eval”。services | 键' docker-compose.yml` (2认同)

kit*_*ris 8

由于您只想列出 docker-compose 文件中的服务,因此可以使用 docker-compose 命令来实现此目的。

docker-compose config --services
Run Code Online (Sandbox Code Playgroud)

不是问题的直接答案,因为它没有使用 yq 但也许有帮助;)