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'Atualize um arquivo yaml, no lugar
yq -i '.ab[0].c = "legal"' arquivo.yamlAtualizar usando variáveis de ambiente
NOME=mike yq -i '.ab[0].c = strenv(NOME)' arquivo.yamlMesclar 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/*.ymlVárias atualizações em um arquivo yaml
yq -i ' .ab[0].c = "legal" | .xyz = "foobar" | .person.name = strenv(NOME)' arquivo.yamlEncontre e atualize um item em uma matriz:
yq '(.[] | select(.name == "foo") | .address) = "12 cat st"'Converter JSON em YAML
yq -Poy amostra.jsonVeja 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
Instalar
Baixe o binário mais recente
wget
Use wget para baixar binários pré-compilados compactados:
Por exemplo, VERSION=v4.2.0 e BINARY=yq_linux_amd64
Compactado via tar.gz
wget https://github.com/mikefarah/yq/releases/download/${VERSION}/${BINARY}.tar.gz -O - | tar xz && mv ${BINARY} /usr/bin/yqBinário simples
wget https://github.com/mikefarah/yq/releases/download/${VERSION}/${BINARY} -O /usr/bin/yq && chmod +x /usr/bin/yqVersão mais recente
wget https://github.com/mikefarah/yq/releases/latest/download/yq_linux_amd64 -O /usr/bin/yq && chmod +x /usr/bin/yqMacOS/Linux via Homebrew:
Usando Homebrew
brew install yqLinux via snap:
snap install yqNotas instantâneas
yq
é instalado com confinamento estrito em um piscar de olhos, 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/myfileou 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.tmpExecute com Docker ou Podman
Uso único:
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...Canalize via STDIN:
Você precisará passar o sinalizador
-i--interactive
para o docker:docker run -i --rm mikefarah/yq '.this.thing' podman execute -i --rm mikefarah/yq '.this.thing'Execute comandos interativamente:
docker run --rm -it -v "${PWD}":/workdir --entrypoint sh mikefarah/yqpodman execute --rm -it -v "${PWD}":/workdir --entrypoint sh mikefarah/yqPode 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 "$@"}Executando como root:
A imagem do contêiner de
yq
não é mais executada no root (#860). Se desejar 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/yqpodman run --user="root" -it --entrypoint sh mikefarah/yqOu, no seu Dockerfile:
FROM mikefarah/yq USER root RUN apk add --no-cache bash USER yqDados de fuso horário ausentes
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 yqPodman com SELinux
Se você estiver usando podman com SELinux, você precisará definir o sinalizador de volume compartilhado
:z
na montagem do volume:-v "${PWD}":/workdir:zAção GitHub
- 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 mais.
Vá instalar:
go install github.com/mikefarah/yq/v4@latestMétodos de instalação suportados pela comunidade
Como estes são apoiados pela comunidade ❤️ - no entanto, podem estar desatualizados em relação aos lançamentos oficialmente suportados.
Observe que o pacote Debian (anteriormente suportado por @rmescandon) não é mais mantido. Use um método de instalação alternativo.
X-CMD
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
nix profile install nixpkgs#yq-goVeja aqui
Webi
webi yqConsulte webi com suporte de @ adithyasunil26 (https://github.com/webinstall/webi-installers/tree/master/yq)
Arco Linux
pacman -S go-yqWindows:
Usando Chocolate
choco install yqApoiado por @chillum (https://chocolatey.org/packages/yq)
Usando colher
scoop install main/yqUsando winget
winget install --id MikeFarah.yqMac:
Usando MacPorts
sudo port selfupdate sudo port install yqApoiado por @herbygillot (https://ports.macports.org/maintainer/github/herbygillot)
Alpino Linux
Alpine Linux v3.20+ (e Edge):
apk add yq-goAlpine Linux até v3.19:
apk add yqApoiado por Tuan Hoang (https://pkgs.alpinelinux.org/packages?name=yq-go)
Flox:
Flox pode ser usado para instalar o yq no Linux, MacOS e Windows por meio de WSL.
flox install yqCaracterísticas
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 XMLSuporta 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)
Uso
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.Problemas conhecidos/recursos ausentes
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.