Cómo analizar un archivo JSON desde la línea de comandos de Linux usando JQ
- 3845
- 990
- Sra. María Teresa Rentería
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
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 dominiops - 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