Yq:检索对象键名称

时间:2019-03-21 12:06:23

标签: 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

由于yq(相当于jq,但对于YAML,我想提取服务名称来获得以下输出:

"apache"
"mysql"
"php"

目前,我可以这样实现:

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

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

问题:是否有任何方法可以通过单个yq命令来实现?

我从this question那里汲取了灵感,尝试了一下却没有成功:

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

2 个答案:

答案 0 :(得分:3)

keysjq中的内置函数,当给定对象时,将其键返回到数组中。因此,实际上它并不是您的Yaml(不是属性)的一部分,这意味着您无法执行services.keys

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

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

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

或者这样(没有猫和烟斗):

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

输出将是:

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

摆脱括号:

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

输出:

"apache"
"mysql"
"php"

有关详细信息,您可以在jq中检查Builtin operators and functions。请注意,yqjq的包装,因此jq的文档将在yq的帮助下提供帮助。

答案 1 :(得分:1)

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

docker-compose config --services

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