Como usar o comando jq para processar JSON no Linux
Jq é um programa analisador poderoso e altamente flexível que pode transmitir e filtrar dados JSON de arquivos e pipes UNIX. Este artigo ensinará o básico do jq, apresentará exemplos de código, bem como algumas implementações alternativas que você pode instalar hoje.
Para que é usado o jq?
O uso mais comum do jq é para processar e manipular respostas JSON de APIs de software como serviço (SaaS). Por exemplo, você pode usar jq junto com cURL para acessar os endpoints da API da Digitalocean e obter os detalhes da sua conta.
Além disso, jq também é um utilitário poderoso para gerenciar grandes arquivos JSON. Alguns dos programas de banco de dados mais populares atualmente, como MongoDB, PostgreSQL e MySQL, suportam JSON como forma de armazenar dados. Dessa forma, aprender jq oferece uma vantagem na compreensão de como esses sistemas de banco de dados funcionam.
Instalando e usando jq
Para começar com jq, instale seu pacote binário em seu sistema:
Encontre um endpoint de API aberto no qual você possa testar o jq. No meu caso, vou usar a API do verificador de IP do ipinfo.io.
O filtro mais básico para jq é o filtro de ponto (.). Isso imprimirá a resposta JSON conforme jq a recebeu de sua entrada padrão:
Outro filtro básico é o símbolo de barra vertical (|). Este é um filtro especial que passa a saída de um filtro como entrada de outro:
O valor após o operador pipe é o “Índice de identificador de objeto”. Isso pesquisa sua entrada JSON por qualquer variável que corresponda ao seu texto e imprime seu valor no terminal. Neste caso, estou procurando o valor da chave “ip:”.
Com o básico feito e limpo, as seções a seguir mostrarão alguns dos truques que você pode fazer usando jq.
1. Criando um leitor de feed básico com jq
A maioria dos sites modernos hoje oferece endpoints de API abertos para leitura de dados dentro de suas plataformas. Por exemplo, cada repositório Github tem seu próprio URL de API para você recuperar os commits e problemas mais recentes desse projeto.
Você pode usar um endpoint de API como este com jq para criar seu próprio feed simples “semelhante a RSS”. Para começar, use cURL para testar se o endpoint está funcionando corretamente:
Execute o seguinte para imprimir a primeira entrada em seu feed:
Isso mostrará os diferentes campos que a API do Github envia para jq. Você pode usá-los para criar seu próprio objeto JSON personalizado canalizando a entrada para o {}
filtro de chaves ( ):
Adicionar o filtro vírgula (,) entre chaves permite adicionar vários campos ao seu objeto personalizado:
Remover o “0” entre colchetes aplicará seu filtro jq a todo o feed:
Você também pode criar um pequeno script Bash para exibir os problemas mais recentes do seu projeto favorito do Github. Cole o seguinte bloco de código dentro de um arquivo de script de shell vazio:
Salve seu arquivo e execute o seguinte comando para torná-lo executável:
Teste seu novo leitor de feed listando a edição mais recente em seu repositório favorito do Github:
2. Lendo e pesquisando em um banco de dados JSON
Além de ler dados de APIs, você também pode usar jq para gerenciar arquivos JSON em sua máquina local. Comece criando um arquivo de banco de dados JSON simples usando seu editor de texto favorito:
Cole o seguinte bloco de dados em seu arquivo e salve-o:
Teste se jq lê seu arquivo JSON corretamente, imprimindo o primeiro objeto em seu array de banco de dados:
Faça uma consulta em seu banco de dados JSON usando o filtro “Object Identifier-Index”. No meu caso, estou procurando o valor da chave “.name” em cada entrada do meu banco de dados:
Você também pode usar algumas funções integradas do jq para filtrar suas consultas com base em determinadas qualidades. Por exemplo, você pode pesquisar e imprimir todos os objetos JSON que possuem um valor “.name” com mais de seis caracteres:
Operando em bancos de dados JSON com jq
Além disso, jq pode operar em bancos de dados JSON semelhantes a uma planilha básica. Por exemplo, o comando a seguir imprime a soma total da chave “.balance” para cada objeto no banco de dados:
Você pode até estender isso adicionando uma instrução condicional à sua consulta. O seguinte só adicionará “.balance” se o valor “.name” do segundo objeto for “Alice”:
É possível remover temporariamente variáveis do seu banco de dados JSON. Isso pode ser útil se você estiver testando seu filtro e quiser ter certeza de que ele ainda pode processar seu conjunto de dados:
Você também pode inserir novas variáveis em seu banco de dados usando o operador “+”. Por exemplo, a linha a seguir adiciona a variável “active: true” ao primeiro objeto do banco de dados:
3. Transformando dados não JSON em jq
Outro recurso brilhante do jq é que ele pode aceitar e trabalhar com dados não JSON. Para conseguir isso, o programa usa um “modo slurp” alternativo, onde converte qualquer espaço e dados delimitados por nova linha em uma matriz JSON.
Você pode ativar esse recurso canalizando dados para jq com um -s
sinalizador:
Uma vantagem de converter seus dados brutos em um array é que você pode abordá-los usando números de índice de array. O comando a seguir adiciona dois valores referindo-se à localização da matriz convertida:
Você pode levar esse local de array adiante e construir um novo código JSON em torno dele. Por exemplo, este código converte o texto do comando echo em um objeto JSON por meio do filtro de chaves:
Além de receber dados brutos, jq também pode retornar dados não JSON como saída. Isso é útil se você estiver usando jq como parte de um script de shell maior e precisar apenas do resultado de seus filtros.
Para fazer isso, execute jq seguido do -r
sinalizador. Por exemplo, o comando a seguir lê todos os nomes do meu arquivo de banco de dados e os retorna como dados de texto simples:
Analisadores JSON alternativos para jq
Como o código do jq é de código aberto, vários desenvolvedores criaram suas próprias versões do analisador JSON. Cada um deles tem seu próprio argumento de venda exclusivo que melhora ou altera uma parte central do jq.
1 curtida
Jaq é um analisador JSON poderoso que fornece um conjunto de recursos quase idêntico ao jq.
Escrito em Rust, um dos maiores pontos de venda do Jaq é que ele pode executar a linguagem jq até 30 vezes mais rápido que o analisador original, mantendo a compatibilidade com versões anteriores. Isso por si só o torna valioso quando você está executando filtros jq grandes e deseja maximizar o desempenho de sua máquina.
Dito isto, uma desvantagem do jaq é que atualmente ele não está disponível nos repositórios Debian, Ubuntu e Fedora. A única maneira de obtê-lo é baixar o Homebrew ou compilá-lo a partir do código-fonte.
2. Vá
Gojq é um analisador JSON alternativo escrito inteiramente em Go. Ele fornece uma versão acessível e fácil de usar do jq que você pode instalar em praticamente qualquer plataforma.
O programa jq original pode ser incrivelmente conciso em suas mensagens de erro. Como resultado, a depuração de scripts jq é especialmente difícil para um novo usuário jq. Gojq resolve esse problema mostrando onde está o erro em seu script, além de fornecer mensagens detalhadas sobre o tipo de erro que ocorreu.
Outro ponto de venda do gojq é que ele pode ler e processar arquivos JSON e YAML. Isso pode ser especialmente útil se você for um usuário do Docker e do Docker Compose e quiser automatizar seu fluxo de trabalho de implantação.
O maior problema do Gojq é que ele removeu alguns dos recursos que vêm por padrão no analisador jq original. Por exemplo, opções como --ascii-output
, --seq
e --sort-keys
não existem no gojq.
3. perguntas frequentes
Ao contrário do jaq e do gojq, o fq é um kit de ferramentas de software abrangente que pode analisar texto e dados binários. Ele pode funcionar com vários formatos populares, como JSON, YAML, HTML e até FLAC.
A maior característica do fq é que ele contém um leitor hexadecimal integrado para arquivos. Isso torna trivial observar a estrutura interna de um arquivo para determinar como ele é feito e se há algo errado com ele. Além disso, fq também usa a mesma sintaxe para jq ao lidar com texto, o que facilita o aprendizado para quem já está familiarizado com jq.
Uma desvantagem deste objectivo ambicioso é que o fq ainda está em forte desenvolvimento. Como tal, alguns dos recursos e comportamentos do programa ainda estão sujeitos a mudanças radicais.
Explorar o jq, como ele funciona e o que o torna especial é apenas o primeiro passo para aprender como criar programas no seu computador. Mergulhe fundo no maravilhoso mundo da codificação lendo os fundamentos da programação shell.
Crédito da imagem: Ferenc Almasi via Unsplash . Todas as alterações e capturas de tela de Ramces Red.
Deixe um comentário