Como usar o comando jq para processar JSON no Linux

Como usar o comando jq para processar JSON no Linux
Uma fotografia de um monitor exibindo um arquivo JSON.

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.

Um terminal mostrando um exemplo de acesso à API do Digitalocean para jq.

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.

Use o site Jq Json Linux 02 Ipinfo Saas

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:”.

Um terminal mostrando a saída filtrada da API ipinfo SaaS por meio de jq.

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.

Um terminal mostrando o padrão

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:

Um terminal mostrando um objeto JSON despojado personalizado da API do Github.

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:

Um terminal mostrando o script personalizado funcionando e imprimindo o problema mais recente 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:

Um terminal mostrando jq imprimindo a primeira entrada no banco de dados JSON.

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:

Um terminal mostrando a saída de jq com uma restrição de comprimento de nome.

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”:

Um terminal mostrando a instrução condicional em jq em execução no banco de dados.

É 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:

Um terminal mostrando a segunda entrada sem chave JSON de nome.

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:

Um terminal mostrando um valor de chave adicional na primeira entrada 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 -ssinalizador:

Um terminal mostrando uma sequência de texto convertida em uma matriz JSON.

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:

Um terminal mostrando um objeto JSON personalizado no formato do banco de dados de amostra.

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 -rsinalizador. 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:

Um terminal mostrando a lista de nomes do banco de dados sem formatação.

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.

Um terminal mostrando o jaq em execução no meu banco de dados de amostra.

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.

Um terminal mostrando um exemplo de leitura de banco de dados para gojq.

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, --seqe --sort-keysnã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.

Um terminal mostrando fq lendo o arquivo de banco de dados de amostra.

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

O seu endereço de email não será publicado. Campos obrigatórios marcados com *