#command-line
#командная строка
Вопрос:
Я уже использовал команду grep sed, чтобы сделать что-то ( cat service.yaml | grep -Po '(service_[^:]*|version:. )'| sed -z 's/nversion//g'
), но теперь мне нужно создать «таблицу» содержимого этого файла на выходе следующим образом:
Комментарии:
1. Что
yq
вы используете? Версия Go или версия Python? После выводаyq --version
2. @Inian yq версия 3.3.2
3. Обратите внимание, что mikefarah yq ( mikefarah.gitbook.io/yq ) — не имеет прямого способа манипулировать результатами в табличном формате, подобном тому, что у вас есть. Существует еще одна версия yq, которую вы можете использовать — github.com/kislyuk/yq который может использовать
jq
underneath, который может помещать результаты в пользовательские форматы csv или tsv4. @Inian что вы имеете в виду, в чем разница между 2 ссылками, которые вы переслали? вы имеете в виду, что существует два типа команд yq?
Ответ №1:
Вот вариант решения @ jq170727, который использует только:
- переводчик yaml в json; и
- jq
Чтобы проиллюстрировать альтернативу yq для (1), я буду использовать npm yaml2json
.
yaml2json service.yaml | jq -r '
keys_unsorted as $keys
| (["service", "version", "replica"] | map(""(.)"")), # quote the headers
($keys[] as $k | .[$k] | [$k, .version, .replica])
| @tsv'
Обратите внимание также, что keys_unsorted
используется, в основном, для соблюдения порядка ключей в исходном файле YAML.
Комментарии:
1. спасибо за ваш ответ, но, как я упоминал ранее, у нас есть 2 вида yq cmd, которые создаются разными людьми, и ваш ответ, и решения @jq170727 связаны с этим: github.com/kislyuk/yq которые используют версию, отличную от версии, которую я использую (я использую: mikefarah.gitbook.io / yq ) так что, к сожалению, ваш cmd не работает для меня
2. Мой конкретный ответ избегает yq именно по этой причине, но вы можете заменить любой другой переводчик yaml-to-json, который вам нравится.
Ответ №2:
Вот фильтр, который может помочь
keys[] as $k | .[$k] | [$k, .version, .replica]
Вот пример ее использования. Для справки это yq, который у меня есть из brew
$ yq --help | grep github
See https://github.com/kislyuk/yq for more information.
and/or https://stedolan.github.io/jq
Сначала преобразуйте yaml в json
$ yq . service.yaml
{
"service-1": {
"replica": 2,
"version": "0.6.24"
},
"service-2": {
"replica": 3,
"version": "0.21.14"
}
}
Исследуйте объект верхнего уровня
$ yq . service.yaml
| jq -r 'keys'
[
"service-1",
"service-2"
]
Сгладить в поток массивов
$ yq . service.yaml
| jq -c 'keys[] as $k | .[$k] | [$k, .version, .replica]'
["service-1","0.6.24",2]
["service-2","0.21.14",3]
Преобразовать в csv и отформатировать в виде таблицы
$ yq . service.yaml
| jq -cr 'keys[] as $k | .[$k] | [$k, .version, .replica] | @csv'
| column -s, -t
"service-1" "0.6.24" 2
"service-2" "0.21.14" 3
Добавление заголовков
$ yq . service.yaml
| jq -cr 'keys[] as $k | .[$k] | [$k, .version, .replica] | @csv'
| (echo '"service","version","replica"'; cat -)
| column -s, -t
"service" "version" "replica"
"service-1" "0.6.24" 2
"service-2" "0.21.14" 3
Если вы не хотите заключать строки в кавычки в последних строках, это может быть лучше
$ yq . service.yaml
| jq -cr 'keys[] as $k | .[$k] | "($k),(.version),(.replica)"'
| (echo '"service","version","replica"'; cat -)
| column -s, -t
"service" "version" "replica"
service-1 0.6.24 2
service-2 0.21.14 3
Комментарии:
1. большое спасибо за ваш полный ответ, просто есть ошибка: «Ошибка: неизвестная команда «.» для «yq» Запустите «yq —help» для использования. «сервис» «версия» «реплика» ‘
2. и дело в том, что, к сожалению, в соответствии с особенностями моего проекта, преобразование файла .yaml в Json запрещено, поэтому я просто могу использовать опцию ‘read’ для команды ‘yq’
3. Кажется, наши версии
yq
отличаются — рад, что вы можете адаптировать это для работы с вашей версией.