La herramienta de línea de comandos jq es un procesador JSON ligero y flexible. Es excelente para analizar la salida JSON en BASH.
Una de las grandes cosas sobre jq es que está escrito en C portátil y no tiene dependencias en tiempo de ejecución. Todo lo que necesitas hacer es descargar un solo binario o usar un gestor de paquetes como apt e instalarlo con un solo comando.
Planificando el script
Para la demostración en este tutorial, utilizaré una API REST externa que devuelve una salida JSON simple llamada QuizAPI:
https://quizapi.io/
Si deseas seguirlo, asegúrate de obtener una clave API gratuita aquí:
https://quizapi.io/clientarea/settings/token
La QuizAPI es gratuita para desarrolladores.
Instalando jq
Hay muchas maneras de instalar jq en tu sistema. Una de las formas más sencillas de hacerlo es usar el gestor de paquetes según tu sistema operativo.
Aquí tienes una lista de los comandos que necesitarías usar dependiendo de tu SO:
Instalar jq en Ubuntu/Debian:
sudo apt-get install jq
Instalar jq en Fedora:
sudo dnf install jq
Instalar jq en openSUSE:
sudo zypper install jq
Instalar jq en Arch:
sudo pacman -S jq
Instalando en Mac con Homebrew:
brew install jq
Instalar en Mac con MacPort:
port install jq
Si estás utilizando otro SO, te recomendaría echar un vistazo a la documentación oficial aquí para más información:
https://stedolan.github.io/jq/download/
Una vez que tengas jq instalado, puedes verificar tu versión actual ejecutando este comando:jq --version
Analizando JSON con jq
Una vez que tengas jq instalado y tu clave API de QuizAPI, puedes analizar la salida JSON de la QuizAPI directamente en tu terminal.
Primero, crea una variable que almacene tu clave API:API_KEY=YOUR_API_KEY_HERE
Para obtener una salida de uno de los endpoints de la QuizAPI, puedes usar el comando curl:curl "https://quizapi.io/api/v1/questions?apiKey=${API_KEY}&limit=10"
Para una salida más específica, puedes usar el Generador de URL de QuizAPI aquí:
https://quizapi.io/api-config
Después de ejecutar el comando curl, la salida que obtendrías se vería así: Esto podría ser bastante difícil de leer, pero gracias a la herramienta de línea de comandos jq, todo lo que necesitamos hacer es canalizar el comando curl a jq y veríamos una salida JSON bien formateada:
curl "https://quizapi.io/api/v1/questions?apiKey=${API_KEY}&limit=10" | jq
Nota el
| jq
al final.En este caso, la salida que obtendrías se vería algo así:
Obteniendo el primer elemento con jq
Supongamos que solo queremos obtener el primer elemento de la salida JSON. Para hacer esto, solo necesitamos especificar el índice que queremos ver con la siguiente sintaxis:jq .[0]
Ahora, si ejecutamos el comando curl nuevamente y canalizamos la salida a jq .[0]
de esta manera:curl "https://quizapi.io/api/v1/questions?apiKey=${API_KEY}&limit=10" | jq .[0]
Solo obtendrás el primer elemento y la salida se verá así:
Supongamos que solo queremos obtener el primer elemento de la salida JSON. Para hacer esto, solo necesitamos especificar el índice que queremos ver con la siguiente sintaxis:
jq .[0]
Ahora, si ejecutamos el comando curl nuevamente y canalizamos la salida a
jq .[0]
de esta manera:curl "https://quizapi.io/api/v1/questions?apiKey=${API_KEY}&limit=10" | jq .[0]
Solo obtendrás el primer elemento y la salida se verá así:
Obteniendo un valor solo para una clave específica
A veces, podrías querer obtener solo el valor de una clave específica. Supongamos que en nuestro ejemplo, la QuizAPI devuelve una lista de preguntas junto con las respuestas, descripciones, etc. Pero, ¿qué pasaría si solo quisieras obtener las preguntas sin la información adicional?
Esto será bastante sencillo con jq; todo lo que necesitas hacer es agregar la clave después del comando jq, por lo que se vería algo así:jq .[].question
Debemos agregar el .[]
ya que la QuizAPI devuelve un array, y al especificar .[]
le decimos a jq que queremos obtener el valor de .question
para todos los elementos del array.
La salida que obtendrás se verá así:
Como puedes ver, ahora solo obtenemos las preguntas sin el resto de los valores.
Usando jq en un script BASH
Vamos a crear un pequeño script bash que debe mostrar la siguiente información para nosotros:
- Obtener solo la primera pregunta de la salida
- Obtener todas las respuestas para esa pregunta
- Asignar las respuestas a variables
- Imprimir la pregunta y las respuestas
Para hacer esto, he preparado el siguiente script:
Nota: asegúrate de cambiar la parte de API_KEY por tu clave real de QuizAPI:
#!/bin/bash
##
# Realiza una llamada a la API de QuizAPI y almacena la salida en una variable
##
output=$(curl 'https://quizapi.io/api/v1/questions?apiKey=API_KEY&limit=10' 2>/dev/null)
##
# Obtiene solo la primera pregunta
##
output=$(echo $output | jq .[0])
##
# Obtiene la pregunta
##
question=$(echo $output | jq .question)
##
# Obtiene las respuestas
##
answer_a=$(echo $output | jq .answers.answer_a)
answer_b=$(echo $output | jq .answers.answer_b)
answer_c=$(echo $output | jq .answers.answer_c)
answer_d=$(echo $output | jq .answers.answer_d)
##
# Muestra la pregunta
##
echo "
Pregunta: ${question}
A) ${answer_a}
B) ${answer_b}
C) ${answer_c}
D) ${answer_d}
"
Si ejecutas el script, obtendrás la siguiente salida:
Incluso podemos ir más allá haciéndolo interactivo para que podamos elegir la respuesta directamente en nuestra terminal.
Ya existe un script de bash que hace esto utilizando la QuizAPI y jq:
Puedes ver ese script aquí:
https://github.com/QuizApi/QuizAPI-BASH/blob/master/quiz.sh
Conclusión
La herramienta de línea de comandos jq es increíble y te brinda la capacidad de trabajar con JSON directamente en tu terminal BASH.
De esta manera, puedes interactuar fácilmente con todo tipo de diferentes APIs REST utilizando BASH.
Para más información, puedes consultar la documentación oficial aquí:
https://stedolan.github.io/jq/manual/
Y para más información sobre la QuizAPI, puedes consultar la documentación oficial aquí:
https://quizapi.io/docs/1.0/overview
Nota: Este contenido fue publicado inicialmente en DevDojo.com
No hay comentarios.:
Publicar un comentario