Como analisar um arquivo JSON da linha de comando Linux usando JQ

Como analisar um arquivo JSON da linha de comando Linux usando JQ

O JSON (Notação do objeto JavaScript) O formato é amplamente usado para representar estruturas de dados e é frequentemente usado para trocar dados entre diferentes camadas de um aplicativo ou pelo uso de chamadas de API. Provavelmente sabemos como interagir com dados formatados por JSON com as linguagens de programação mais usadas, como analisar o JSON com o Python, mas e se precisarmos interagir com ele da linha de comando ou em um script de bash? Neste artigo, veremos como podemos realizar essa tarefa usando o JQ utilidade e vamos aprender seu uso básico.

Neste tutorial, você aprenderá:

  • Como instalar o JQ nas distribuições Linux mais usadas ou compilá -lo da fonte
  • Como usar o JQ para analisar dados formatados por JSON
  • Como combinar filtros usando ", e" | "
  • Como usar o comprimento, as chaves, as funções de mapa e o mapa



Requisitos de software e convenções usadas

Requisitos de software e convenções de linha de comando Linux
Categoria Requisitos, convenções ou versão de software usada
Sistema Independente da distribuição
Programas O aplicativo JQ
Outro Familiaridade com dados JSON e o Bash Shell
Convenções # - requer que os comandos Linux sejam executados com privilégios root diretamente como usuário root ou por uso de sudo comando
$ - Requer que os comandos do Linux sejam executados como um usuário não privilegiado regular

Instalação

O JQ O utilitário está incluído em todos os principais repositórios de distribuições Linux, portanto, instalá -lo é muito fácil: só precisamos usar nosso gerenciador de pacotes favorito. Se estamos usando o Debian, ou uma distribuição baseada em Debian, como Ubuntu ou Linux Mint, podemos usar apt:

$ sudo apt install jq


Se tivermos uma preferência pela família de distribuições Red Hat, como Fedora, Centos ou Rhel, podemos instalar JQ através do DNF Gerenciador de pacotes (em versões recentes dessas distribuições que substituiu Yum). Para instalar o pacote que executaríamos:

$ sudo dnf install jq

Instalação JQ no Archlinux é tão fácil. O gerente de pacote de distribuição é Pacman, e o pacote está disponível no repositório comunitário. Podemos executar a instalação com o seguinte comando:

$ sudo pacman -s install jq

Se não pudermos, ou por algum motivo, não queremos usar um pacote binário pré-construído, podemos compilar JQ da fonte. Em
As seguintes linhas descrevemos as etapas necessárias.

Construindo e instalando a partir da fonte

Para construir e instalar o JQ a partir da fonte, a primeira coisa que devemos fazer é baixar um Tarball de lançamento. No momento de
Escrevendo, o último lançamento disponível é 1.6. Para baixar o tarball sem sair do terminal, podemos usar wget:

$ wget https: // github.com/stedolan/jq/liberações/download/jq-1.6/JQ-1.6.alcatrão.gz

Depois que o download estiver concluído, devemos descomprimir e extrair o tarball:

$ tar -xzf jq -1.6.alcatrão.gz

O próximo passo é entrar no JQ-1.6 Diretório, criado como resultado do último comando:

$ CD JQ-1.6

Agora, para compilar o código -fonte, precisamos dos seguintes utilitários:

  • GCC
  • Autorake
  • Libtool
  • fazer

Para construir o software que executamos:

$ autoreConf -fi $ ./Configure && make && sudo fazer instalar 
cópia de

O faça instalar O comando, por padrão, fará com que os binários sejam instalados no /usr/local/bin diretório e bibliotecas em /usr/local/lib. Se queremos personalizar a instalação e alterar esses diretórios, devemos especificar um prefixo diferente, usando o --prefixo opção ao lançar o ./configure roteiro.

Por exemplo, para instalar o software apenas para um usuário específico, poderíamos passar o $ Home/.local Diretório como prefixo: nesse caso, os binários seriam instalados em $ Home/.Local/Bin e bibliotecas no $ Home/.Local/Lib; Com essa configuração, não haveria necessidade de lançar o faça instalar comando com privilégios administrativos. Se você quiser saber como organizar melhor o software instalado fonte de formulário, pode verificar nosso artigo sobre o utilitário GNU Stow.

Uso

Uma vez que temos JQ Instalado, podemos usá -lo para analisar os arquivos JSON da linha de comando. Para o bem deste tutorial, trabalharemos com uma estrutura de dados simples que contém alguns detalhes sobre três caracteres do livro Lord of the Rings. Os dados são salvos no personagens.JSON arquivo.

O JQ O utilitário funciona aplicando filtros em um fluxo de dados JSON. Como primeira coisa, usaremos o filtro mais simples, ., que retorna os dados de entrada inalterados, mas bem impressos. Para essa característica, ele pode ser usado para formatar dados de uma maneira mais legível:

$ jq . personagens.JSON

O comando acima produz a seguinte saída:

"caracteres": ["name": "Aragorn", "Race": "Man", "Name": "Gimli", "Race": "Dwarf", "Nome": "Legolas" , "raça": "elf"] 
cópia de

Agora, suponha que queremos filtrar os dados para obter apenas o valor associado ao personagens chave. Para realizar a tarefa, fornecemos o nome da chave e obtemos seu valor (ou nulo Se não existir):

$ jq .personagens personagens.JSON

Em nosso exemplo, o valor associado à chave "caracteres" é um variedade, Então, obtemos o seguinte resultado:

["Nome": "Aragorn", "Race": "Man", "Nome": "Gimli", "Race": "Dwarf", "Name": "Legolas", "Race": "ELF"]
cópia de

E se quisermos obter apenas o primeiro elemento da matriz? Só precisamos "extrair" o índice certo dele. Sabendo que as matrizes são baseado em zero, Podemos correr:

$ jq .caracteres [0] caracteres.JSON


O comando nos dá:

"Nome": "Aragorn", "Race": "Man" 
cópia de

Também podemos obter uma fatia da matriz. Diga, por exemplo, queremos obter apenas seus dois primeiros elementos. Nós corremos:

$ jq .caracteres [0: 2] caracteres.JSON

O comando nos dá o seguinte resultado:

["Name": "Aragorn", "Race": "Man", "Name": "Gimli", "Race": "Dwarf"] 
cópia de

O corte também funciona em strings, então se corrermos:

$ jq .Personagens [0].Nome [0: 2] caracteres.JSON

Obtemos uma fatia (as duas primeiras letras) da corda "Aragorn": "AR".

Acesso elementos separadamente

Nos exemplos acima, imprimimos o conteúdo da matriz "caracteres", que consiste em três objetos que descrevem personagens de fantasia. E se quisermos iterar sobre a dita matriz? Devemos fazer para que os elementos contidos nele sejam devolvidos separadamente, para que devemos usar [] sem fornecer nenhum índice:

$ jq .personagens [] personagens.JSON

A saída do comando é:

"Nome": "Aragorn", "Race": "Man" "Name": "Gimli", "Race": "Dwarf", "Arma": "Ax" "Nome": "Legolas" , "Race": "Elf" 
cópia de

Nesse caso, obtivemos 3 resultados: os objetos contidos na matriz. A mesma técnica pode ser usada para iterar sobre os valores de um objeto; neste caso, o primeiro contido na matriz de "caracteres":

$ jq .caracteres [0] [] caracteres.JSON

Aqui obtemos o seguinte resultado:

"Aragorn" "homem" 
cópia de

O "" e "|" operadores

O "" e "|" Os operadores são usados ​​para combinar dois ou mais filtros, mas trabalham de maneiras diferentes. Quando dois filtros são separados por uma vírgula, ambos são aplicados, separadamente, nos dados fornecidos e vamos obter dois resultados diferentes. Vamos ver um exemplo:

$ jq '.Personagens [0], .Personagens [2] 'personagens.JSON

Os dados formatados por JSON contidos nos caracteres.o arquivo JSON é primeiro filtrado com .Personagens [0] e então com .Charaters [2], Para obter o primeiro e o terceiro elemento da matriz "personagens". Ao executar o comando acima, obtemos dois separado resultados:

"Nome": "Aragorn", "Race": "Man" "Nome": "Legolas", "Race": "Elf"
cópia de

O “|” O operador funciona de maneira diferente, de uma maneira semelhante a um tubo UNIX. A saída produzida pelo filtro à esquerda do operador é passada como entrada para o filtro à direita do operador. Se um filtro à esquerda do operador produzir vários resultados, o filtro à direita do operador será aplicado a cada um deles:

$ jq '.Personagens [] | .Nome 'caracteres.JSON

Neste exemplo, temos dois filtros. À esquerda do operador, temos o .personagens[] filtro, que, como vimos anteriormente, vamos obter os elementos da matriz de "caracteres" como resultados separados. No nosso caso, cada resultado é um objeto com o "nome" e "corrida" propriedades. O .nome filtrar à direita do | O operador é aplicado a cada um dos objetos, por isso obtemos o seguinte resultado:

"Aragorn" "Gimli" Legolas "
cópia de

Funções

O utilitário JQ inclui algumas funções muito úteis que podemos aplicar ao JSON - dados formatados. Agora veremos alguns deles: comprimento, chaves, tem e mapa.



A função de comprimento

O primeiro sobre o qual falaremos é comprimento, que, como o nome sugere, vamos recuperar o comprimento de objetos, matrizes e strings. O comprimento dos objetos é o número de seus pares de valor-chave; A duração das matrizes é representada pelo número de elementos que eles contêm; O comprimento de uma string é o número de caracteres que é composto. Vamos ver como usar a função. Suponha que queremos saber a duração da matriz de "personagens", nós corremos:

$ jq '.caracteres | caracteres de comprimento.JSON

Como esperado, obtemos 3 como resultado, uma vez que é o número de elementos na matriz. Da mesma forma, para obter a duração do primeiro objeto na matriz que poderíamos executar:

$ jq '.caracteres [0] | caracteres de comprimento.JSON

Desta vez, obtemos 2 como resultado, como é o número de pares de valor contidos no objeto. Como já dissemos, a mesma função aplicada a uma string, retorna o número de caracteres contidos nela; portanto, por exemplo, em execução:

$ jq '.Personagens [0].nome | caracteres de comprimento.JSON

Nós recebemos 7 como resultado, que é o comprimento da corda "Aragorn".

A função das chaves

O chaves A função pode ser aplicada em objetos ou matrizes. No primeiro caso, ele retorna uma matriz contendo
as teclas de objetos:

$ jq '.caracteres [0] | Os personagens de Keys.JSON ["Nome", "Race"]
cópia de

Quando aplicado a uma matriz, ele retorna outra matriz contendo os índices do primeiro:

$ jq '.caracteres | Os personagens de Keys.JSON [0, 1, 2] 
cópia de

O chaves função retorna os elementos classificados: se queremos que os elementos sejam devolvidos em ordem de inserção, podemos usar o keys_unsorted função em vez disso.

Verificando se um objeto tiver uma chave

Uma operação muito comum que podemos querer executar em um objeto é verificar se ele contiver uma chave específica. Para realizar esta tarefa, podemos usar o tem função. Por exemplo, para verificar se o objetivo principal de nossos dados formatados por JSON contém a chave "armas", poderíamos executar:

$ jq 'tem ("armas"' personagens.JSON FALSO
cópia de

Nesse caso, como esperado, a função retornou falso Como o objeto contém apenas a tecla "caracteres":

$ jq 'tem ("personagens").JSON Verdadeiro
cópia de

Quando aplicado às matrizes, a função retorna true se a matriz tiver um elemento no índice dado ou false caso contrário:

$ jq '.caracteres | tem (3) 'caracteres.JSON FALSO
cópia de

A matriz "personagens" tem apenas 3 elementos; As matrizes são indexadas zero, por isso, verificando se a matriz como um elemento associado ao índice 3 retorna falso.

A função do mapa

A função do mapa vamos aplicar um filtro a cada elemento de uma determinada matriz. Por exemplo, digamos que queremos verificar a existência da tecla "Nome" em cada um dos objetos contidos na matriz "caracteres". Podemos combinar o mapa e tem Funções da seguinte maneira:

$ jq '.caracteres | mapa (tem ("nome") 'caracteres.JSON [verdadeiro, verdadeiro, verdadeiro] 
cópia de

Conclusões

Neste artigo, mal arranhamos a superfície dos recursos oferecidos pelo JQ Utilitário que nos permitiu analisar e manipular dados formatados por JSON da linha de comando. Aprendemos o uso básico do programa, como o "" e "|" Os operadores trabalham e como usar o comprimento, as chaves, as funções do mapa, para obter respectivamente os fundos de matrizes, cordas e objetos, obter teclas de objeto ou índices de matriz, verifique se existe uma chave em um objeto ou se uma matriz tiver um elemento no índice dado e aplique um filtro ou uma função a cada elemento de uma matriz. Para descobrir tudo JQ pode fazer, vá e dê uma olhada no manual do programa!

Tutoriais do Linux relacionados:

  • Como trabalhar com a API de Rest WooCommerce com Python
  • Coisas para instalar no Ubuntu 20.04
  • Introdução às Loops de JavaScript
  • Como rastrear chamadas de sistema feitas por um processo com Strace em…
  • Mastering Bash Script Loops
  • Uma introdução à automação, ferramentas e técnicas do Linux
  • Manipulação de big data para diversão e lucro Parte 1
  • Loops aninhados em scripts de basquete
  • Coisas para fazer depois de instalar o Ubuntu 20.04 fossa focal linux
  • Como usar um script de bash para executar seus scripts Python