легкий и портативный процессор командной строки YAML, JSON и XML. yq
использует синтаксис, подобный jq, но работает с файлами yaml, а также с json, xml, свойствами, csv и tsv. Он еще не поддерживает все, что делает jq
, но поддерживает наиболее распространенные операции и функции, и постоянно добавляются новые.
yq написан на go, так что вы можете скачать бесплатный двоичный файл для вашей платформы, и все готово! Если вы предпочитаете, можно использовать различные менеджеры пакетов, а также Docker и Podman, которые перечислены ниже.
Прочитайте значение:
yq '.ab[0].c' file.yaml
Труба из STDIN:
yq '.ab[0].c' < file.yaml
Обновите файл yaml на месте
yq -i '.ab[0].c = "крутой"' file.yaml
Обновление с использованием переменных среды
NAME=mike yq -i '.ab[0].c = strenv(NAME)' file.yaml
Объединить несколько файлов
# объединить два файлаsyq -n 'load("file1.yaml") * load("file2.yaml")'# объединить с помощью glob:# обратите внимание на использование `ea` для оценки всех файлов одновременно# вместо последовательного q эа '. как $item ireduce ({}; . * $item)' путь/к/*.yml
Множественные обновления файла yaml
yq -i ' .ab[0].c = "круто" | .xyz = "фубар" | .person.name = strenv(ИМЯ)' file.yaml
Найдите и обновите элемент в массиве:
yq '(.[] | select(.name == "foo") | .address) = "12 cat st"'
Конвертировать JSON в YAML
yq -Poy sample.json
Дополнительные примеры см. в рецептах, а дополнительную информацию — в документации.
Загляните в обсуждения, чтобы найти общие вопросы и интересные идеи.
Используйте wget для загрузки предварительно скомпилированных двоичных файлов в формате gzip:
Например, VERSION=v4.2.0 и BINARY=yq_linux_amd64.
wget https://github.com/mikefarah/yq/releases/download/${VERSION}/${BINARY}.tar.gz -O - | tar xz && mv ${BINARY} /usr/bin/yq
wget https://github.com/mikefarah/yq/releases/download/${VERSION}/${BINARY} -O /usr/bin/yq && chmod +x /usr/bin/yq
wget https://github.com/mikefarah/yq/releases/latest/download/yq_linux_amd64 -O /usr/bin/yq && chmod +x /usr/bin/yq
Использование доморощенного пива
brew install yq
snap install yq
yq
устанавливается со строгим ограничением в Snap, это означает, что у него нет прямого доступа к корневым файлам. Чтобы прочитать корневые файлы, вы можете:
sudo cat /etc/myfile | yq '.a.path'
А для записи в корневой файл вы можете использовать губку:
sudo cat /etc/myfile | yq '.a.path = "value"' | sudo sponge /etc/myfile
или записать во временный файл:
sudo cat /etc/myfile | yq '.a.path = "value"' | sudo tee /etc/myfile.tmp sudo mv /etc/myfile.tmp /etc/myfile rm /etc/myfile.tmp
docker run --rm -v "${PWD}":/workdir mikefarah/yq [команда] [флаги] [выражение ]ФАЙЛ...
Обратите внимание, что вы можете запустить yq
в докере без доступа к сети и других привилегий, если хотите, а именно --security-opt=no-new-privileges --cap-drop all --network none
.
podman run --rm -v "${PWD}":/workdir mikefarah/yq [команда] [флаги] [выражение ]ФАЙЛ...
Вам нужно будет передать флаг -i--interactive
в докер:
docker run -i --rm mikefarah/yq '.this.thing' < myfile.yml
podman run -i --rm mikefarah/yq '.this.thing' < myfile.yml
docker run --rm -it -v "${PWD}":/workdir --entrypoint sh mikefarah/yq
podman run --rm -it -v "${PWD}":/workdir --entrypoint sh mikefarah/yq
Может быть полезно иметь функцию bash, чтобы не вводить всю команду docker:
yq() { docker run --rm -i -v "${PWD}":/workdir mikefarah/yq "$@"}
yq() { podman run --rm -i -v "${PWD}":/workdir mikefarah/yq "$@"}
Образ контейнера yq
больше не запускается под rootом (#860). Если вы хотите установить дополнительные элементы в образ контейнера или у вас возникают проблемы с разрешениями при попытке чтения/записи файлов, вам необходимо либо:
docker run --user="root" -it --entrypoint sh mikefarah/yq
podman run --user="root" -it --entrypoint sh mikefarah/yq
Или в вашем Dockerfile:
FROM mikefarah/yq USER root RUN apk add --no-cache bash USER yq
По умолчанию изображение alpine, которое использует yq, не включает данные о часовом поясе. Если вы хотите использовать оператор tz
, вам необходимо включить следующие данные:
FROM mikefarah/yq USER root RUN apk add --no-cache tzdata USER yq
Если вы используете podman с SELinux, вам нужно будет установить флаг общего тома :z
при монтировании тома:
-v "${PWD}":/workdir:z
- name: Set foobar to cool uses: mikefarah/yq@master with: cmd: yq -i '.foo.bar = "cool"' 'config.yml' - name: Get an entry with a variable that might contain dots or spaces id: get_username uses: mikefarah/yq@master with: cmd: yq '.all.children.["${{ matrix.ip_address }}"].username' ops/inventories/production.yml - name: Reuse a variable obtained in another step run: echo ${{ steps.get_username.outputs.result }}
Дополнительную информацию см. на https://mikefarah.gitbook.io/yq/usage/github-action.
go install github.com/mikefarah/yq/v4@latest
Поскольку они поддерживаются сообществом ❤️, однако они могут устареть по сравнению с официально поддерживаемыми выпусками.
Обратите внимание, что пакет Debian (ранее поддерживаемый @rmescandon) больше не поддерживается. Пожалуйста, используйте альтернативный метод установки.
Оформить заказ yq
на x-cmd: https://x-cmd.com/mod/yq
Мгновенные результаты: смотрите результаты работы вашего фильтра yq в режиме реального времени.
Обработка ошибок: обнаружена синтаксическая ошибка? Он отобразит сообщение об ошибке и результаты ближайшего действующего фильтра.
Спасибо @edwinjhlee!
nix profile install nixpkgs#yq-go
Смотрите здесь
webi yq
См. webi. Поддерживается @adithyasunil26 (https://github.com/webinstall/webi-installers/tree/master/yq).
pacman -S go-yq
Использование шоколадного
choco install yq
При поддержке @chillum (https://chocolatey.org/packages/yq)
Использование совка
scoop install main/yq
Использование вингета
winget install --id MikeFarah.yq
Использование MacPorts
sudo port selfupdate sudo port install yq
При поддержке @herbygillot (https://ports.macports.org/maintainer/github/herbygillot)
Alpine Linux v3.20+ (и Edge):
apk add yq-go
Alpine Linux до версии 3.19:
apk add yq
При поддержке Туан Хоанг (https://pkgs.alpinelinux.org/packages?name=yq-go)
Flox можно использовать для установки yq в Linux, MacOS и Windows через WSL.
flox install yq
Подробная документация со множеством примеров
Написан на портативном языке Go, поэтому вы можете скачать прекрасный бинарный файл без зависимостей.
Использует синтаксис, аналогичный jq
, но работает с файлами YAML, JSON и XML.
Полностью поддерживает многодокументные файлы yaml.
Поддерживает блоки начального содержания yaml (например, jekyll/assemble).
Цветной вывод yaml
Манипулирование датой/временем и форматирование с помощью TZ
Глубокие структуры данных
Сортировка ключей
Управляйте комментариями yaml, стилями, тегами, привязками и псевдонимами.
Обновление на месте
Сложные выражения для выбора и обновления
Сохраняет форматирование yaml и комментарии при обновлении (хотя есть проблемы с пробелами).
Декодировать/кодировать данные base64
Загрузка содержимого из других файлов
Преобразование в/из json/ndjson
Преобразование в/из XML
Преобразование в/из свойств
Преобразование в/из csv/tsv
Общие сценарии завершения оболочки (bash/zsh/fish/powershell)
Уменьшите, чтобы объединить несколько файлов или суммировать массив или другие интересные вещи.
Действие Github для использования в вашем автоматизированном конвейере (спасибо @devorbitus)
Ознакомьтесь с документацией для более подробного и расширенного использования.
Usage: yq [flags] yq [command] Examples: # yq defaults to 'eval' command if no command is specified. See "yq eval --help" for more examples. yq '.stuff' < myfile.yml # outputs the data at the "stuff" node from "myfile.yml" yq -i '.stuff = "foo"' myfile.yml # update myfile.yml in place Available Commands: completion Generate the autocompletion script for the specified shell eval (default) Apply the expression to each document in each yaml file in sequence eval-all Loads _all_ yaml documents of _all_ yaml files and runs expression once help Help about any command Flags: -C, --colors force print with colors -e, --exit-status set exit status if there are no matches or null or false is returned -f, --front-matter string (extract|process) first input as yaml front-matter. Extract will pull out the yaml content, process will run the expression against the yaml content, leaving the remaining data intact --header-preprocess Slurp any header comments and separators before processing expression. (default true) -h, --help help for yq -I, --indent int sets indent level for output (default 2) -i, --inplace update the file in place of first file given. -p, --input-format string [yaml|y|xml|x] parse format for input. Note that json is a subset of yaml. (default "yaml") -M, --no-colors force print with no colors -N, --no-doc Don't print document separators (---) -n, --null-input Don't read input, simply evaluate the expression given. Useful for creating docs from scratch. -o, --output-format string [yaml|y|json|j|props|p|xml|x] output format type. (default "yaml") -P, --prettyPrint pretty print, shorthand for '... style = ""' -s, --split-exp string print each result (or doc) into a file named (exp). [exp] argument must return a string. You can use $index in the expression as the result counter. --unwrapScalar unwrap scalar, print the value with no quotes, colors or comments (default true) -v, --verbose verbose mode -V, --version Print version information and quit --xml-attribute-prefix string prefix for xml attributes (default "+") --xml-content-name string name for xml content (if no attribute name is present). (default "+content") Use "yq [command] --help" for more information about a command.
yq
пытается максимально сохранить позиции комментариев и пробелы, но он не обрабатывает все сценарии (подробнее см. https://github.com/go-yaml/yaml/tree/v3).
У Powershell есть собственное мнение по поводу цитирования yq.
«да», «нет» были удалены как логические значения в стандарте yaml 1.2, который является стандартом yq.
Ознакомьтесь с советами и рекомендациями, чтобы узнать о более распространенных проблемах и решениях.