Lançamento do jq 1.7
(github.com/jqlang)- As opções
--argfilee os filtrosleaf_pathserecurse_down, que estavam sem suporte, foram removidos - A imagem Docker agora é distribuída em
ghcr.io/jqlang/jqem vez do Docker Hub - Os alvos de build de lançamento agora especificam várias arquiteturas para Linux, macOS, Windows e Docker
- Foi adicionado
--raw-output0, permitindo inserir bytes NUL entre as saídas; a saída de strings contendo NUL agora gera erro - No Windows, foi adicionada a opção
--binary/-b, permitindo saída com fim de linha\nem vez de\r\n - Agora é possível definir a cor das chaves de objetos com
JQ_COLORS, e a variável de ambienteNO_COLORé respeitada para desativar a saída colorida - Foi corrigido o problema dos códigos de saída da opção
--exit-code/-e: agora retorna 0 se o último valor de saída for verdadeiro, 1 se forfalseounull, e 4 se não houver saída - Literais numéricos decimais agora são usados para preservar a precisão dos literais numéricos; operações de comparação respeitam essa precisão, mas operações aritméticas podem truncá-la
- Foram adicionadas novas funções internas:
pick(stream),debug(msgs),scan($re; $flags)eabs - Em instruções
if, agora é possível omitir o ramoelse, e umelseomitido é tratado com o comportamento de. haltehalt_erroragora encerram imediatamente, sem continuar para a próxima entrada- Foram corrigidos problemas como saída JSON incorreta com números grandes em algumas plataformas, falha de segmentação ao usar libjq com threads e crash de assert em
--jsonarg - CI, scan build, release e build do site passaram a usar GitHub Actions, e o OSS-Fuzz foi adicionado
1 comentários
Opiniões no Hacker News
Gosto muito do JQ porque ele é excelente
Implementamos em Clojure um subconjunto do JQ para permitir que usuários processem/filtrem dados no nosso produto (uma ferramenta para Kafka baseada em JVM e navegador). Foi uma das tarefas mais divertidas entre os códigos que já escrevi e, como gosto de escrever gramáticas em si, também deixo um grande agradecimento ao Instaparse: https://github.com/Engelberg/instaparse
Ao implementar, descobri que o JQ é LISP-2, o que me surpreendeu porque, só olhando a sintaxe, não parece ser: https://github.com/jqlang/jq/wiki/jq-Language-Description#:~...
Mas me incomoda a sintaxe de consulta pouco intuitiva, o fato de precisar pesquisar a cada passo minúsculo e o resultado sair parecendo um feitiço difícil de decifrar para quem não é especialista em jq. Tenho uma rejeição instintiva a DSLs em geral que ficam embutidas dentro de strings, como htmx ou tailwind
Ainda assim, reconheço que é um software bem-feito e que às vezes não há alternativa melhor. Para lidar com JSON no bash, ele também é a opção menos ruim, no sentido de ser muito melhor que um monstro feito de sed/awk/cut. Só que comandos jq enfiados no meio de scripts, sempre como strings indecifráveis, estão perto daquilo que eu não quero ver em código, junto com expressões regulares. Como alternativa, já tentei passar inline Python dentro de um heredoc via pipe, mas isso fica tão bagunçado quanto scripts jq
Nos exemplos, selecione "Jq parser (partially working)" e clique em "Parse" para ver a árvore do parser para o código em "Input source". Feedback é sempre bem-vindo
jq simplifica a maioria dos casos (na prática, notação de ponto para JSON) e também viabiliza a cauda longa de casos complexos
Gosto de jq, mas também uso JMESPath (especialmente com a AWS CLI), yq (incluindo tomlq e xq) e dasel. É uma pena que hclq esteja praticamente morto
https://jmespath.org/
https://kislyuk.github.io/yq/
https://github.com/TomWright/dasel
https://hclq.sh/
Uso
jqhá anos e sempre dou um jeito de montar o que preciso, mas ainda nunca achei intuitivo. Quando fica só um pouco mais complexo, é difícil chegar à solução sem ler a documentação por bastante tempo, e eu gostaria que fosse mais fácil de usarAjudou quando eu estava aprendendo a sintaxe pela primeira vez, e ainda volto a ela quando esbarro em alguma sintaxe estranha
O principal uso é converter para JSON coisas como CSV, TOML e XML para então passar por pipe para o jq: https://github.com/sentriz/rsl
https://github.com/kellyjonbrazil/jello
https://github.com/wwkimball/yamlpath
Inspirada no XPath, ela é mais familiar do que uma DSL totalmente nova, e considero que seu recurso principal é a busca recursiva por chaves. Se você escrever
people..address, ela encontra em qualquer lugar do JSON todas as chaves "address" abaixo de "people". É minha linguagem de parsing favorita para JSON, e também escrevi um texto apresentando como usá-la para fazer parsing de datasets JSONhttps://github.com/JSONPath-Plus/JSONPath
https://scrapfly.io/blog/parse-json-jsonpath-python/
Se você usa jq só de vez em quando e precisa consultar a documentação toda vez, vale experimentar o gron. É JSON que dá para usar com grep
https://github.com/tomnomnom/gron
Venho usando
curl cheat.sh/jqhá anos, e acho o cheat.sh como um todo um excelente material. Hoje em dia, provavelmente usaria algo como o ChatGPTTambém dá para fazer algo como
gron | grep | sed | gron -uUm dos motivos pelos quais gosto de jq, ou consigo tolerá-lo, é a estabilidade. Scripts que escrevi anos atrás ainda funcionam exatamente igual hoje
Por outro lado, o código que mantive para yq quebrava com frequência, à medida que o yq continuava melhorando de maneiras que não eram retrocompatíveis. Não investiguei com que frequência essas mudanças aconteceram, mas fui afetado várias vezes em lugares como scripts de CI, onde as versões das ferramentas básicas variam bastante e o ritmo de atualização também é diferente
Por isso sempre fui grato aos mantenedores do jq por entenderem a importância da retrocompatibilidade. Espero que este anúncio não signifique que essa estabilidade era apenas um efeito colateral acidental da estagnação, e que, ao corrigirem a estagnação, sacrificarão a estabilidade
https://kislyuk.github.io/yq/
https://github.com/kyle-long/yq#yq
https://github.com/up1/yq-1#yq-command-line-yamlxml-processo...
https://github.com/onixspot/yq-2#yq-command-line-yamlxmltoml...
https://github.com/simonrupf/convert2json#convert2json
Além das ferramentas parecidas com jq, há duas ferramentas interessantes para usar junto com jq: jo e jc
https://github.com/jpmens/jo
https://github.com/kellyjonbrazil/jc
Ouvi falar do gron pela primeira vez aqui, mas acrescento por completude. Enquanto isso, JSON parece estar virando uma espécie de formato padrão de saída para ferramentas de CLI. O ideal seria todas as ferramentas de CLI oferecerem uma flag como
--json, tornando o jc desnecessáriohttps://jless.io/
https://github.com/tomnomnom/gron
Post relacionado do mês passado, "First release of jq in 5 years": https://news.ycombinator.com/item?id=36951830
Sou grande fã do jq e uso o tempo todo
Finalmente aconteceu
Foi muito legal ver a comunidade se unir para recrutar novos mantenedores e reviver o projeto. Agradecimentos especiais, em particular, a @stedolan, @itchyny e @owenthereal, pelos nomes de usuário no GitHub
jq e miller são itens essenciais da minha caixa de ferramentas, junto com awk e vim
https://github.com/johnkerl/miller
A nova função embutida
pick(stream)adiciona a capacidade de emitir uma projeção de um objeto ou array de entradajq -n '{"a": 1, "b": {"c": 2, "d": 3}, "e": 4} | pick(.a, .b.c, .x)'Isso é um verdadeiro salvador. Obrigado aos contribuidores
$ jq -n '{"a": 1, "b": {"c": 2, "d": 3}, "e": 4} | {a, e}'{"a": 1,"e": 4}pickque também funcionasse com dados em streamingTambém quero recomendar o jaq. É um clone do jq focado em correção, velocidade e simplicidade
Ele implementa apenas um subconjunto do jq, mas tenho usado com bastante satisfação até agora: https://github.com/01mf02/jaq