um processador YAML, JSON e XML de linha de comando leve e portátil. yq
usa sintaxe semelhante a jq, mas funciona com arquivos yaml, bem como json, xml, propriedades, csv e tsv. Ele ainda não suporta tudo o que jq
faz - mas suporta as operações e funções mais comuns, e mais estão sendo adicionadas continuamente.
yq está escrito em go - então você pode baixar um binário livre de dependência para sua plataforma e pronto! Se preferir, há uma variedade de gerenciadores de pacotes que podem ser usados, assim como Docker e Podman, todos listados abaixo.
Leia um valor:
yq '.ab[0].c' arquivo.yaml
Tubo de STDIN:
yq '.ab[0].c' <arquivo.yaml
Atualize um arquivo yaml, no lugar
yq -i '.ab[0].c = "legal"' arquivo.yaml
Atualizar usando variáveis de ambiente
NOME=mike yq -i '.ab[0].c = strenv(NOME)' arquivo.yaml
Mesclar vários arquivos
# mesclar dois arquivosyq -n 'load("file1.yaml") * load("file2.yaml")'# mesclar usando globs:# observe o uso de `ea` para avaliar todos os arquivos de uma vez# em vez de em sequenciayq eh'. como $item ireduce ({}; . * $item )'caminho/para/*.yml
Várias atualizações em um arquivo yaml
yq -i ' .ab[0].c = "legal" | .xyz = "foobar" | .person.name = strenv(NOME)' arquivo.yaml
Encontre e atualize um item em uma matriz:
yq '(.[] | select(.name == "foo") | .address) = "12 cat st"'
Converter JSON em YAML
yq -Poy amostra.json
Veja as receitas para mais exemplos e a documentação para mais informações.
Dê uma olhada nas discussões para perguntas comuns e ideias interessantes
Use wget para baixar binários pré-compilados compactados:
Por exemplo, VERSION=v4.2.0 e 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
Usando Homebrew
brew install yq
snap install yq
yq
é instalado com confinamento estrito rapidamente, isso significa que não tem acesso direto aos arquivos raiz. Para ler arquivos raiz, você pode:
sudo cat /etc/myfile | yq '.a.path'
E para gravar em um arquivo raiz você pode usar esponja:
sudo cat /etc/myfile | yq '.a.path = "value"' | sudo sponge /etc/myfile
ou grave em um arquivo temporário:
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 [comando] [sinalizadores] [expressão] ARQUIVO...
Observe que você pode executar yq
no docker sem acesso à rede e outros privilégios, se desejar, ou seja --security-opt=no-new-privileges --cap-drop all --network none
.
podman run --rm -v "${PWD}":/workdir mikefarah/yq [comando] [sinalizadores] [expressão] ARQUIVO...
Você precisará passar o sinalizador -i--interactive
para o docker:
docker run -i --rm mikefarah/yq '.this.thing' <meuarquivo.yml
podman execute -i --rm mikefarah/yq '.this.thing' <meuarquivo.yml
docker run --rm -it -v "${PWD}":/workdir --entrypoint sh mikefarah/yq
podman execute --rm -it -v "${PWD}":/workdir --entrypoint sh mikefarah/yq
Pode ser útil ter uma função bash para evitar digitar todo o comando do docker:
yq() { docker run --rm -i -v "${PWD}":/workdir mikefarah/yq "$@"}
yq() { podman execute --rm -i -v "${PWD}":/workdir mikefarah/yq "$@"}
A imagem do contêiner de yq
não é mais executada no root (#860). Se quiser instalar mais coisas na imagem do contêiner ou se estiver tendo problemas de permissão ao tentar ler/gravar arquivos, você precisará:
docker run --user="root" -it --entrypoint sh mikefarah/yq
podman run --user="root" -it --entrypoint sh mikefarah/yq
Ou, no seu Dockerfile:
FROM mikefarah/yq USER root RUN apk add --no-cache bash USER yq
Por padrão, a imagem alpina que yq usa não inclui dados de fuso horário. Se quiser usar o operador tz
, você precisará incluir estes dados:
FROM mikefarah/yq USER root RUN apk add --no-cache tzdata USER yq
Se você estiver usando podman com SELinux, você precisará definir o sinalizador de volume compartilhado :z
na montagem do volume:
-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 }}
Consulte https://mikefarah.gitbook.io/yq/usage/github-action para obter mais informações.
go install github.com/mikefarah/yq/v4@latest
Como são apoiados pela comunidade ❤️ - no entanto, podem estar desatualizados em relação aos lançamentos com suporte oficial.
Observe que o pacote Debian (anteriormente suportado por @rmescandon) não é mais mantido. Use um método de instalação alternativo.
Confira yq
em x-cmd: https://x-cmd.com/mod/yq
Resultados instantâneos: veja a saída do seu filtro yq em tempo real.
Tratamento de erros: encontrou um erro de sintaxe? Ele exibirá a mensagem de erro e os resultados do filtro válido mais próximo
Obrigado @edwinjhlee!
nix profile install nixpkgs#yq-go
Veja aqui
webi yq
Consulte webi apoiado por @ adithyasunil26 (https://github.com/webinstall/webi-installers/tree/master/yq)
pacman -S go-yq
Usando Chocolate
choco install yq
Apoiado por @chillum (https://chocolatey.org/packages/yq)
Usando colher
scoop install main/yq
Usando winget
winget install --id MikeFarah.yq
Usando MacPorts
sudo port selfupdate sudo port install yq
Apoiado por @herbygillot (https://ports.macports.org/maintainer/github/herbygillot)
Alpine Linux v3.20+ (e Edge):
apk add yq-go
Alpine Linux até v3.19:
apk add yq
Apoiado por Tuan Hoang (https://pkgs.alpinelinux.org/packages?name=yq-go)
Flox pode ser usado para instalar yq em Linux, MacOS e Windows por meio de WSL.
flox install yq
Documentação detalhada com muitos exemplos
Escrito em Go portátil, para que você possa baixar um adorável binário livre de dependências
Usa sintaxe semelhante ao jq
, mas funciona com arquivos YAML, JSON e XML
Suporta totalmente arquivos yaml com vários documentos
Suporta blocos de front mate yaml (por exemplo, jekyll/assemble)
Saída yaml colorida
Manipulação e formatação de data/hora com TZ
Estruturas de dados profundas
Classificar chaves
Manipule comentários, estilos, tags, âncoras e aliases em yaml.
Atualização no local
Expressões complexas para selecionar e atualizar
Mantém a formatação e os comentários do yaml durante a atualização (embora haja problemas com espaços em branco)
Decodificar/codificar dados base64
Carregar conteúdo de outros arquivos
Converter de/para json/ndjson
Converter para/de xml
Converter de/para propriedades
Converter de/para csv/tsv
Scripts gerais de conclusão de shell (bash/zsh/fish/powershell)
Reduzir para mesclar vários arquivos ou somar uma matriz ou outras coisas sofisticadas.
Ação do Github para usar em seu pipeline automatizado (obrigado @devorbitus)
Confira a documentação para um uso mais detalhado e avançado.
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
tenta preservar as posições dos comentários e os espaços em branco tanto quanto possível, mas não lida com todos os cenários (consulte https://github.com/go-yaml/yaml/tree/v3 para obter detalhes)
Powershell tem suas próprias... opiniões sobre como citar yq
"sim", "não" foram descartados como valores booleanos no padrão yaml 1.2 - que é o padrão que yq assume.
Veja dicas e truques para problemas e soluções mais comuns.