Introducción
jq es un procesador JSON de línea de comandos ligero y flexible.
jq es como sed para datos JSON:puede usarlo para segmentar, filtrar, mapear y transformar datos estructurados con la misma facilidad que sed, awk, grep y sus amigos le permiten jugar con texto.
También jq está escrito en C portátil y no tiene dependencias de tiempo de ejecución. Puede descargar un solo binario, enviarlo a una máquina lejana del mismo tipo y esperar que funcione.
jq puede convertir el formato de datos que tiene en el que desea con muy poco esfuerzo, y el programa para hacerlo suele ser más corto y simple de lo que espera.
En este artículo, aprenderemos a usar el comando JQ para manipular y trabajar con datos JSON en un shell de Linux.
Instalar el comando JQ
El comando JQ no está disponible en algunas distribuciones de Linux de forma predeterminada; Debe descargarse en el sistema antes de que pueda usarse. Puede descargar el comando JQ como cualquier otro paquete en su sistema. En Ubuntu, use el siguiente comando para instalar la utilidad JQ:
qadry@unixcop:~$ sudo apt install jq -y
Reading package lists... Done
Building dependency tree
Reading state information... Done
The following package was automatically installed and is no longer required:
libreoffice-help-common
Use 'sudo apt autoremove' to remove it.
The following additional packages will be installed:
libjq1 libonig5
The following NEW packages will be installed:
jq libjq1 libonig5
0 upgraded, 3 newly installed, 0 to remove and 240 not upgraded.
Need to get 313 kB of archives.
After this operation, 1062 kB of additional disk space will be used.
Get:1 http://us.archive.ubuntu.com/ubuntu focal/universe amd64 libonig5 amd64 6.9.4-1 [142 kB]
Get:2 http://us.archive.ubuntu.com/ubuntu focal-updates/universe amd64 libjq1 amd64 1.6-1ubuntu0.20.04.1 [121 kB]
Get:3 http://us.archive.ubuntu.com/ubuntu focal-updates/universe amd64 jq amd64 1.6-1ubuntu0.20.04.1 [50.2 kB]
Fetched 313 kB in 2s (128 kB/s)
Selecting previously unselected package libonig5:amd64.
(Reading database ... 196337 files and directories currently installed.)
Preparing to unpack .../libonig5_6.9.4-1_amd64.deb ...
Unpacking libonig5:amd64 (6.9.4-1) ...
Selecting previously unselected package libjq1:amd64.
Preparing to unpack .../libjq1_1.6-1ubuntu0.20.04.1_amd64.deb ...
Unpacking libjq1:amd64 (1.6-1ubuntu0.20.04.1) ...
Selecting previously unselected package jq.
Preparing to unpack .../jq_1.6-1ubuntu0.20.04.1_amd64.deb ...
Unpacking jq (1.6-1ubuntu0.20.04.1) ...
Setting up libonig5:amd64 (6.9.4-1) ...
Setting up libjq1:amd64 (1.6-1ubuntu0.20.04.1) ...
Setting up jq (1.6-1ubuntu0.20.04.1) ...
Processing triggers for man-db (2.9.1-1) ...
Processing triggers for libc-bin (2.31-0ubuntu9.2) ...#######################################################################################.........
qadry@unixcop:~$
Y use este comando a continuación si está ejecutando una distribución como CentOS 8 que ya tiene JQ de forma predeterminada, obtendrá un resultado similar a este:
sudo dnf install jq
Sintaxis
Echemos un vistazo a la sintaxis del comando JQ:
jq [options] [file...]
jq [options] --args [strings...]
jq [options] --jsonargs [JSON_TEXTS...]
Organizar datos JSON usando el comando JQ
JQ organiza y embellece los datos JSON al imprimirlos en la salida estándar.
Entonces, en este ejemplo, tenemos un archivo JSON llamado unixcop.json y necesitamos enviar los datos a la salida estándar:
qadry@unixcop:~$ cat unixcop.json
{"product":{"name": "speaker","id": "123"}}
qadry@unixcop:~$
Los datos impresos en la salida estándar mediante el comando cat están desorganizados y desordenados. Podemos organizar estos datos usando el siguiente comando JQ
qadry@unixcop:~$ jq '.' unixcop.json
{
"product": {
"name": "speaker",
"id": "123"
}
}
qadry@unixcop:~$
Ahora los datos se han vuelto mucho más organizados y fáciles de entender. Este filtro es especialmente necesario cuando se accede a datos de las API; Los datos almacenados en las API pueden estar muy desorganizados y ser confusos.
Acceda a una propiedad usando el comando JQ
El .campo filter junto con el comando JQ can_be used to access property object in the shell.
Podemos usar el .campo operador. Por ejemplo, para acceder a la propiedad del producto, podemos usar este comando:
qadry@unixcop:~$ jq '.product' unixcop.json
{
"name": "speaker",
"id": "123"
}
qadry@unixcop:~$
También podemos acceder a los elementos presentes dentro de la propiedad usando el .field operador. Para acceder al ítem de nombre en la propiedad del producto usaremos:
qadry@unixcop:~$ jq '.product.name' unixcop.json
"speaker"
qadry@unixcop:~$
Acceda a un elemento de matriz usando el comando JQ
También podemos acceder y mostrar los elementos presentes dentro de una matriz en un archivo JSON usando .[] operador. Para este ejemplo, vamos a modificar nuestro archivo JSON para que se vea así:
qadry@unixcop:~$ cat unixcop.json
[{"name": "TV","id": "213"},{"name": "speaker","id": "123"},{"name": "keyboard","id": "432"}]
qadry@unixcop:~$ jq '.[]' unixcop.json
{
"name": "TV",
"id": "213"
}
{
"name": "speaker",
"id": "123"
}
{
"name": "keyboard",
"id": "432"
}
qadry@unixcop:~$
Para generar solo la segunda matriz, podemos modificar 1 en el operador de matriz al comando anterior de la siguiente manera:
qadry@unixcop:~$ jq '.[1]' unixcop.json
{
"name": "speaker",
"id": "123"
}
qadry@unixcop:~$
Nota :la matriz comienza en 0
Si queremos acceder a la propiedad de nombre en la tercera matriz, ejecutaremos el siguiente comando:
qadry@unixcop:~$ jq '.[2].name' unixcop.json
"keyboard"
qadry@unixcop:~$
También podemos usar .[3] para acceder a la cuarta matriz y nos aseguramos de que sea nula.
qadry@unixcop:~$ jq '.[3].name' unixcop.json
null
qadry@unixcop:~$
También para acceder a todas las propiedades de nombre dentro de los arreglos podemos ejecutar este comando:
qadry@unixcop:~$ jq '.[].name' unixcop.json
"TV"
"speaker"
"keyboard"
qadry@unixcop:~$
Conclusión
El comando JQ se usa para transformar los datos JSON en un formato más legible e imprimirlos en la salida estándar en Linux. El comando JQ se basa en filtros que se utilizan para buscar e imprimir solo los datos necesarios de un archivo JSON.