Cómo analizar un archivo JSON desde la línea de comandos de Linux usando JQ

Cómo analizar un archivo JSON desde la línea de comandos de Linux usando JQ

El Json (Notación del objeto JavaScript) El formato se usa ampliamente para representar estructuras de datos, y se usa con frecuencia para intercambiar datos entre diferentes capas de una aplicación, o mediante el uso de llamadas API. Probablemente sabemos cómo interactuar con los datos con formato JSON con los lenguajes de programación más utilizados, como el análisis JSON con Python, pero ¿qué pasa si necesitamos interactuar con él desde la línea de comandos o en un script bash? En este artículo veremos cómo podemos lograr dicha tarea utilizando el JQ utilidad y aprenderemos su uso básico.

En este tutorial aprenderás:

  • Cómo instalar JQ en las distribuciones de Linux más utilizadas o compilarla desde la fuente
  • Cómo usar JQ para analizar datos con formato JSON
  • Cómo combinar filtros usando "," y "|"
  • Cómo usar la longitud, las teclas, las funciones de HIS y MAP



Requisitos y convenciones de software utilizados

Requisitos de software y convenciones de línea de comandos de Linux
Categoría Requisitos, convenciones o versión de software utilizada
Sistema Independiente de la distribución
Software La aplicación JQ
Otro Familiaridad con los datos de JSON y el shell bash
Convenciones # - requiere que los comandos de Linux dados se ejecuten con privilegios raíz directamente como un usuario raíz o mediante el uso de sudo dominio
ps - Requiere que los comandos de Linux dados se ejecuten como un usuario regular no privilegiado

Instalación

El JQ La utilidad está incluida en todos los principales repositorios de distribuciones de Linux, por lo tanto, instalarla es muy fácil: solo necesitamos usar nuestro administrador de paquetes favorito. Si estamos utilizando Debian o una distribución basada en Debian como Ubuntu o Linux Mint, podemos usar apto:

$ sudo apt install jq


Si tenemos preferencia por la familia de distribuciones Red Hat, como Fedora, Centos o Rhel, podemos instalar JQ mediante el DNF Manager de paquetes (en versiones recientes de esas distribuciones, reemplazó a Yum). Para instalar el paquete ejecutaríamos:

$ sudo dnf instalación jq

Instalación JQ en Archlinux es igual de fácil. El administrador del paquete de distribución es Pacman, y el paquete está disponible en el repositorio de la comunidad. Podemos realizar la instalación con el siguiente comando:

$ sudo Pacman -s instalación JQ

Si no podemos, o por alguna razón no queremos usar un paquete binario preconstruido, podemos compilar JQ desde la fuente. En
Las siguientes líneas describimos los pasos necesarios.

Construyendo e instalando desde la fuente

Para construir e instalar JQ desde la fuente, lo primero que debemos hacer es descargar un lanzamiento de tarball. En el momento de
Escribiendo, el último lanzamiento disponible es 1.6. Para descargar el tarball sin salir de la terminal, podemos usar wget:

$ wget https: // github.com/stedolan/jq/comunes/download/jq-1.6/jq-1.6.alquitrán.GZ

Una vez que se completa la descarga, debemos descomprimir y extraer el tarball:

$ TAR -XZF JQ -1.6.alquitrán.GZ

El siguiente paso es ingresar al JQ-1.6 directorio, creado como resultado del último comando:

$ CD JQ-1.6

Ahora, para compilar el código fuente necesitamos las siguientes utilidades:

  • GCC
  • automoquero
  • Libbtool
  • hacer

Para construir el software que ejecutamos:

$ Autoreconf -fi $ ./configure && make && sudo make install 
Copiar

El hacer instalar El comando, por defecto, hará que los binarios se instalen en el /usr/local/bin directorio y bibliotecas en /usr/local/lib. Si queremos personalizar la instalación y cambiar esos directorios, debemos especificar un prefijo diferente, utilizando el --prefijo opción Al iniciar el ./Configurar guion.

Por ejemplo, para instalar el software solo para un usuario específico, podríamos pasar el $ Inicio/.local directorio como prefijo: en ese caso los binarios se instalarían en $ Inicio/.local/contenedor y bibliotecas en el $ Inicio/.local/lib; Con tal configuración no habría necesidad de iniciar el hacer instalar Comando con privilegios administrativos. Si desea saber cómo organizar mejor la fuente de formulario instalada de software, puede consultar nuestro artículo sobre la utilidad GNU Stow.

Uso

Una vez que tengamos JQ Instalado, podemos usarlo para analizar los archivos JSON desde la línea de comandos. En aras de este tutorial, trabajaremos con una estructura de datos simple que contiene algunos detalles sobre tres personajes del libro de Lord of the Rings. Los datos se guardan en el caracteres.json archivo.

El JQ Utilidad funciona aplicando filtros en un flujo de datos JSON. Como lo primero, usaremos el filtro más simple, ., que devuelve los datos de entrada sin cambios pero bastante impresos. Para esta característica, se puede usar para formatear los datos de una manera más legible:

$ JQ . caracteres.json

El comando anterior produce la siguiente salida:

"personajes": ["nombre": "aragorn", "raza": "hombre", "nombre": "gimli", "raza": "dwarf", "nombre": "Legolas" , "raza": "elf"] 
Copiar

Ahora, supongamos que queremos filtrar los datos para obtener solo el valor asociado al caracteres llave. Para lograr la tarea, proporcionamos el nombre de la clave y obtenemos su valor (o nulo Si no existe):

$ JQ .personajes de personajes.json

En nuestro ejemplo, el valor asociado con la tecla "caracteres" es una formación, Entonces obtenemos el siguiente resultado:

["Nombre": "Aragorn", "Race": "Man", "Nombre": "Gimli", "Race": "Dwarf", "Nombre": "Legolas", "Race": "Elfo"]
Copiar

¿Qué pasa si queremos obtener solo el primer elemento de la matriz?? Solo necesitamos "extraer" el índice correcto de él. Sabiendo que las matrices son basado en cero, Podemos correr:

$ JQ .personajes [0] personajes.json


El comando nos da:

"Nombre": "Aragorn", "raza": "hombre" 
Copiar

También podemos obtener una porción de la matriz. Digamos, por ejemplo, queremos obtener solo sus dos primeros elementos. Corremos:

$ JQ .personajes [0: 2] caracteres.json

El comando nos da el siguiente resultado:

["Nombre": "Aragorn", "raza": "hombre", "nombre": "gimli", "raza": "dwarf"] 
Copiar

El corte también funciona en cadenas, así que si corremos:

$ JQ .personajes [0].Nombre [0: 2] caracteres.json

Obtenemos una porción (las dos primeras letras) de la cadena "Aragorn": "Arkansas".

Acceder a elementos de matriz por separado

En los ejemplos anteriores imprimimos el contenido de la matriz de "caracteres", que consiste en tres objetos que describen los personajes de fantasía. ¿Qué pasa si queremos iterar sobre dicha matriz?? Debemos hacer para que los elementos contenidos en él se devuelvan por separado, por lo que debemos usar [] sin proporcionar ningún índice:

$ JQ .personajes [] personajes.json

La salida del comando es:

"Nombre": "Aragorn", "raza": "hombre" "nombre": "gimli", "raza": "dwarf", "arma": "ax" "nombre": "Legolas" , "raza": "elf" 
Copiar

En este caso obtuvimos 3 resultados: los objetos contenidos en la matriz. La misma técnica se puede utilizar para iterar sobre los valores de un objeto, en este caso el primero contenido en la matriz "caracteres":

$ JQ .personajes [0] [] personajes.json

Aquí obtenemos el siguiente resultado:

"Aragorn" "Hombre" 
Copiar

El "," y "|" operadores

El "," y "|" Los operadores se utilizan para combinar dos o más filtros, pero funcionan de diferentes maneras. Cuando dos filtros están separados por una coma, ambos se aplican, por separado, en los datos dados y obtengamos dos resultados diferentes. Veamos un ejemplo:

$ jq '.personajes [0], .personajes [2] 'personajes.json

Los datos formatados en JSON contenidos en los caracteres.El archivo JSON se filtra primero con .personajes [0] Y luego con .Caraters [2], Para obtener el primer y el tercer elemento de la matriz de "personajes". Al ejecutar el comando anterior, obtenemos dos separado resultados:

"Nombre": "Aragorn", "Race": "Man" "Nombre": "Legolas", "Race": "Elf"
Copiar

El "|" El operador funciona de manera diferente, de manera similar a una tubería de Unix. La salida producida por el filtro a la izquierda del operador, se pasa como entrada al filtro a la derecha del operador. Si un filtro a la izquierda del operador produce múltiples resultados, el filtro a la derecha del operador se aplica a cada uno de ellos:

$ jq '.personajes [] | .Nombre 'caracteres.json

En este ejemplo tenemos dos filtros. A la izquierda del operador tenemos el .caracteres[] Filtro, que como vimos anteriormente, obtengamos los elementos de la matriz de "caracteres" como resultados separados. En nuestro caso, cada resultado es un objeto con el "nombre" y "carrera" propiedades. El .nombre Filtrar a la derecha del | El operador se aplica a cada uno de los objetos, por lo que obtenemos el siguiente resultado:

"Aragorn" "Gimli" "Legolas"
Copiar

Funciones

La utilidad JQ incluye algunas funciones muy útiles que podemos aplicar a los datos JSON - formateados. Ahora veremos algunos de ellos: longitud, llaves, tiene y mapa.



La función de longitud

El primero del que hablaremos es longitud, que, como su nombre sugiere, recuperemos la longitud de los objetos, matrices y cuerdas. La longitud de los objetos es el número de sus pares de valor clave; La longitud de las matrices está representada por el número de elementos que contienen; La longitud de una cadena es el número de caracteres que está compuesto. Veamos cómo usar la función. Supongamos que queremos saber la longitud de la matriz de "personajes", ejecutamos:

$ jq '.personajes | personajes de longitud.json

Como se esperaba, obtenemos 3 Como resultado, ya que es el número de elementos en la matriz. De la misma manera, para obtener la longitud del primer objeto en la matriz podríamos ejecutar:

$ jq '.personajes [0] | personajes de longitud.json

Esta vez obtenemos 2 Como resultado, ya que es el número de pares de valor contenidos en el objeto. Como ya dijimos, la misma función aplicada a una cadena, devuelve el número de caracteres contenidos en ella, por lo tanto, por ejemplo, en ejecución:

$ jq '.personajes [0].nombre | personajes de longitud.json

Nosotros recibimos 7 Como resultado, que es la longitud de la cadena "Aragorn".

La función de las teclas

El llaves la función se puede aplicar en objetos o matrices. En el primer caso devuelve una matriz que contiene
las teclas de los objetos:

$ jq '.personajes [0] | personajes de Keys.JSON ["Nombre", "raza"]
Copiar

Cuando se aplica a una matriz, devuelve otra matriz que contiene los índices del primero:

$ jq '.personajes | personajes de Keys.JSON [0, 1, 2] 
Copiar

El llaves la función devuelve los elementos ordenados: si queremos que los elementos se devuelvan en orden de inserción, podemos usar el keys_unsorted función en su lugar.

Verificar si un objeto tiene una clave

Una operación muy común que deseamos realizar en un objeto, es verificar si contiene una clave específica. Para lograr esta tarea podemos usar el tiene función. Por ejemplo, para verificar si el objeto principal de nuestros datos formatados en JSON contiene la clave de "armas", podríamos ejecutar:

$ jq 'tiene ("armas")' personajes.json falso
Copiar

En este caso, como se esperaba, la función regresó FALSO Dado que el objeto contiene solo la tecla "caracteres":

$ jq 'tiene ("personajes")' personajes.json verdadero
Copiar

Cuando se aplica a las matrices, la función devuelve verdaderas si la matriz tiene un elemento en el índice o falso dado de lo contrario:

$ jq '.personajes | tiene (3) personajes.json falso
Copiar

La matriz de "personajes" tiene solo 3 elementos; Las matrices están indexadas por cero, por lo que verifica si la matriz como un elemento asociado con el índice 3 devoluciones FALSO.

La función del mapa

La función del mapa aplicamos un filtro a cada elemento de una matriz determinada. Por ejemplo, digamos que queremos verificar la existencia de la tecla "Nombre" en cada uno de los objetos contenidos en la matriz de "caracteres". Podemos combinar el mapa y tiene Funciones de esta manera:

$ jq '.personajes | MAP (HAS ("Nombre")) caracteres.json [verdadero, verdadero, verdadero] 
Copiar

Conclusiones

En este artículo apenas rascamos la superficie de las características ofrecidas por el JQ Utilidad que nos permitió analizar y manipular datos con formato JSON desde la línea de comandos. Aprendimos el uso básico del programa, cómo el "," y "|" Los operadores funcionan, y cómo usar la longitud, las claves, las funciones de HI y el mapa, para obtener respectivamente la longitud de matrices, cadenas y objetos, obtener teclas de objetos o índices de matriz, verifique si una clave existe en un objeto o si una matriz tiene un elemento en el índice dado, y aplique un filtro o una función a cada elemento de una matriz. Para descubrir todo JQ puede hacer, ir y echar un vistazo al manual del programa!

Tutoriales de Linux relacionados:

  • Cómo trabajar con la API REST de WooCommerce con Python
  • Cosas para instalar en Ubuntu 20.04
  • Introducción a JavaScript Loops
  • Cómo rastrear las llamadas del sistema realizadas por un proceso con Strace On ..
  • Mastering Bash Script Loops
  • Una introducción a la automatización, herramientas y técnicas de Linux
  • Manipulación de Big Data para la diversión y las ganancias Parte 1
  • Bucles anidados en guiones Bash
  • Cosas que hacer después de instalar Ubuntu 20.04 fossa focal Linux
  • Cómo usar un script bash para ejecutar sus scripts de Python