Cómo utilizar el comando jq para procesar JSON en Linux
Jq es un programa analizador potente y altamente flexible que puede transmitir y filtrar datos JSON de archivos y canalizaciones UNIX. Este artículo le enseñará los conceptos básicos de jq, presentará ejemplos de código y algunas implementaciones alternativas que puede instalar hoy.
¿Para qué se utiliza jq?
El uso más común de jq es procesar y manipular respuestas JSON de las API de software como servicio (SaaS). Por ejemplo, puede usar jq junto con cURL para acceder a los puntos finales de la API de Digitalocean y obtener los detalles de su cuenta.
Aparte de eso, jq también es una poderosa utilidad para administrar archivos JSON de gran tamaño. Algunos de los programas de bases de datos más populares en la actualidad, como MongoDB, PostgreSQL y MySQL, admiten JSON como forma de almacenar datos. Como tal, aprender jq le brinda una ventaja para comprender cómo funcionan esos sistemas de bases de datos.
Instalación y uso de jq
Para comenzar con jq, instale su paquete binario en su sistema:
Encuentre un punto final de API abierto en el que pueda probar jq. En mi caso, usaré la API de verificación de IP de ipinfo.io.
El filtro más básico para jq es el filtro de puntos (.). Esto imprimirá bastante la respuesta JSON tal como jq la recibió de su entrada estándar:
Otro filtro básico es el símbolo de tubería (|). Este es un filtro especial que pasa la salida de un filtro como entrada de otro:
El valor después del operador de tubería es el «Índice de identificador de objeto». Esto busca en su entrada JSON cualquier variable que coincida con su texto e imprime su valor en la terminal. En este caso, estoy buscando el valor de la clave “ip:”.
Con los conceptos básicos hechos y desempolvados, las siguientes secciones le mostrarán algunos de los trucos que puede hacer usando jq.
1. Creando un lector de feeds básico con jq
La mayoría de los sitios web modernos ofrecen puntos finales API abiertos para leer datos dentro de sus plataformas. Por ejemplo, cada repositorio de Github tiene su propia URL API para que pueda recuperar las últimas confirmaciones y problemas de ese proyecto.
Puede utilizar un punto final API como este con jq para crear su propio feed «tipo RSS» simple. Para comenzar, use cURL para probar si el punto final funciona correctamente:
Ejecute lo siguiente para imprimir la primera entrada en su feed:
Esto mostrará los diferentes campos que la API de Github envía a jq. Puede usarlos para crear su propio objeto JSON personalizado canalizando la entrada al {}
filtro de llaves ():
Agregar el filtro de coma (,) dentro de las llaves le permite agregar múltiples campos a su objeto personalizado:
Al eliminar el «0» dentro de los corchetes, se aplicará su filtro jq a todo el feed:
También puedes crear un pequeño script Bash para mostrar los últimos números de tu proyecto Github favorito. Pegue el siguiente bloque de código dentro de un archivo de script de shell vacío:
Guarde su archivo, luego ejecute el siguiente comando para hacerlo ejecutable:
Pruebe su nuevo lector de feeds enumerando el último número en su repositorio de Github favorito:
2. Lectura y búsqueda a través de una base de datos JSON
Además de leer datos de las API, también puede usar jq para administrar archivos JSON en su máquina local. Comience creando un archivo de base de datos JSON simple usando su editor de texto favorito:
Pegue el siguiente bloque de datos dentro de su archivo y luego guárdelo:
Pruebe si jq lee su archivo JSON correctamente imprimiendo el primer objeto en su matriz de base de datos:
Realice una consulta en su base de datos JSON utilizando el filtro “Índice-identificador de objeto”. En mi caso, estoy buscando el valor de la clave «.name» en cada entrada de mi base de datos:
También puede utilizar algunas de las funciones integradas de jq para filtrar sus consultas en función de determinadas cualidades. Por ejemplo, puede buscar e imprimir todos los objetos JSON que tengan un valor «.name» con más de seis caracteres:
Operando en Bases de Datos JSON con jq
Además de eso, jq puede operar en bases de datos JSON de manera similar a una hoja de cálculo básica. Por ejemplo, el siguiente comando imprime la suma total de la clave «.balance» para cada objeto en la base de datos:
Incluso puedes ampliar esto agregando una declaración condicional a tu consulta. Lo siguiente solo agregará «.balance» si el valor «.name» del segundo objeto es «Alice»:
Es posible eliminar temporalmente variables de su base de datos JSON. Esto puede resultar útil si está probando su filtro y desea asegurarse de que aún pueda procesar su conjunto de datos:
También puede insertar nuevas variables en su base de datos usando el operador “+”. Por ejemplo, la siguiente línea agrega la variable «activo: verdadero» al primer objeto de la base de datos:
3. Transformación de datos que no son JSON en jq
Otra característica brillante de jq es que puede aceptar y trabajar con datos que no sean JSON. Para lograrlo, el programa utiliza un «modo sorber» alternativo donde convierte cualquier dato delimitado por espacios y nuevas líneas en una matriz JSON.
Puede habilitar esta característica canalizando datos a jq con una -s
bandera:
Una ventaja de convertir sus datos sin procesar en una matriz es que puede abordarlos utilizando números de índice de matriz. El siguiente comando agrega dos valores haciendo referencia a su ubicación de matriz convertida:
Puede llevar la ubicación de esta matriz más allá y construir un nuevo código JSON a su alrededor. Por ejemplo, este código convierte el texto del comando echo a un objeto JSON a través del filtro de llaves:
Además de recibir datos sin procesar, jq también puede devolver datos que no sean JSON como salida. Esto es útil si estás usando jq como parte de un script de shell más grande y solo necesitas el resultado de sus filtros.
Para hacer eso, ejecute jq seguido de la -r
bandera. Por ejemplo, el siguiente comando lee todos los nombres de mi archivo de base de datos y los devuelve como datos de texto sin formato:
Analizadores JSON alternativos a jq
Dado que el código de jq es de código abierto, varios desarrolladores han creado sus propias versiones del analizador JSON. Cada uno de estos tiene su propio punto de venta único que mejora o cambia una parte central de jq.
1 Me gusta
Jaq es un potente analizador JSON que proporciona un conjunto de características casi idénticas a jq.
Escrito en Rust, uno de los mayores puntos de venta de Jaq es que puede ejecutar el lenguaje jq hasta 30 veces más rápido que el analizador original y al mismo tiempo conserva la compatibilidad con versiones anteriores. Esto por sí solo lo hace valioso cuando ejecuta filtros jq grandes y desea maximizar el rendimiento de su máquina.
Dicho esto, una desventaja de jaq es que actualmente no está disponible en los repositorios de Debian, Ubuntu y Fedora. La única forma de obtenerlo es descargar Homebrew o compilarlo desde el código fuente.
2. Ir
Gojq es un analizador JSON alternativo escrito íntegramente en Go. Proporciona una versión accesible y fácil de usar de jq que puede instalar en casi cualquier plataforma.
El programa jq original puede ser increíblemente conciso en sus mensajes de error. Como resultado, depurar scripts jq es especialmente difícil para un nuevo usuario de jq. Gojq resuelve este problema mostrándole dónde está el error en su secuencia de comandos y brindándole mensajes detallados sobre el tipo de error que ocurrió.
Otro punto de venta de gojq es que puede leer y procesar archivos JSON y YAML. Esto puede resultar especialmente útil si es usuario de Docker y Docker Compose y desea automatizar su flujo de trabajo de implementación.
El mayor problema de Gojq es que eliminó algunas de las funciones que vienen de forma predeterminada en el analizador jq original. Por ejemplo, opciones como --ascii-output
, --seq
y --sort-keys
no existen en gojq.
3. fq
A diferencia de jaq y gojq, fq es un completo conjunto de herramientas de software que puede analizar tanto texto como datos binarios. Puede funcionar con una variedad de formatos populares como JSON, YAML, HTML e incluso FLAC.
La característica más importante de fq es que contiene un lector hexadecimal incorporado para archivos. Esto hace que sea trivial observar la estructura interna de un archivo para determinar cómo está creado y si tiene algún problema. Aparte de eso, fq también usa la misma sintaxis para jq cuando trabaja con texto, lo que hace que sea fácil de aprender para cualquiera que ya esté familiarizado con jq.
Una desventaja de este ambicioso objetivo es que fq aún se encuentra en pleno desarrollo. Como tal, algunas de las características y comportamientos del programa todavía están sujetos a cambios radicales.
Explorar jq, cómo funciona y qué lo hace especial es sólo el primer paso para aprender a crear programas en su computadora. Sumérgete profundamente en el maravilloso mundo de la codificación leyendo los conceptos básicos de la programación shell.
Crédito de la imagen: Ferenc Almasi a través de Unsplash . Todas las modificaciones y capturas de pantalla realizadas por Ramces Red.
Deja una respuesta