3

我有一个看起来像这样的 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

我想提取服务名称,这与YAMLyq的等价物相同jq,以获得以下输出:

"apache"
"mysql"
"php"

目前我可以这样实现:

$ cat docker-compose.yml | yq '.services' | yq 'keys[]'
"apache"
"mysql"
"php"

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

问题:有没有办法用一个yq命令来实现它?

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

$ cat docker-compose.yml | yq '.services.keys[]'
jq: error: Cannot iterate over null
4

2 回答 2

12

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

要获取密钥,您可以在使用Python yq时执行以下操作:

我们将services在第一部分中获取对象,然后将其传递给keys它将根据给定对象返回键列表

cat docker-compose.yml | yq '.services | keys'

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

yq '.services | keys' docker-compose.yml

输出将是:

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

要摆脱括号:

yq '.services | keys[]' docker-compose.yml

输出:

"apache"
"mysql"
"php"

有关详细信息的更多信息,您可以查看. jq请注意,它yq是一个包装器,jq因此文档jq会在推荐的帮助下有所帮助yq


Go yq上你可以做

yq e '.services | keys'
于 2019-03-21T12:48:41.873 回答
4

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

docker-compose config --services

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

于 2019-07-23T09:48:03.313 回答