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 команда?

Я попробовал это без успеха, черпая вдохновение в этом вопросе:

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

1 ответ

Решение

keys это встроенная функция в jq когда дан объект, возвращает его ключи в массиве. Так что это на самом деле не отдельно от вашего 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, Обратите внимание, что yq это обертка для jq поэтому документация jq было бы полезно в качестве помощи yq рекомендую.

Поскольку вы просто хотите перечислить сервисы из файла docker-compose, вы можете добиться этого с помощью команды docker-compose.

docker-compose config --services

Не является прямым ответом на вопрос, поскольку он не использует yq, но, возможно, это помогает;)

Другие вопросы по тегам