Tutorial de jq
Claro, aquà tienes un tutorial completo sobre jq, la herramienta de lÃnea de comandos para procesar JSON.
Tutorial de jq: Procesa JSON como un profesional
jq es como sed o awk para JSON: te permite filtrar, transformar y extraer datos de estructuras JSON de forma sencilla desde la terminal.
Instalación
Linux
# Debian/Ubuntu
sudo apt install jq
# Fedora
sudo dnf install jq
# Arch
sudo pacman -S jq
macOS
brew install jq
Windows
Descarga el ejecutable desde stedolan.github.io/jq/download o usa choco install jq.
Conceptos básicos
jq recibe un JSON por entrada estándar y aplica un filtro para producir una salida.
Ejemplo mÃnimo
echo '{"nombre": "Juan", "edad": 30}' | jq '.nombre'
Salida: "Juan"
El filtro .nombre extrae el valor de la clave "nombre".
Filtros esenciales
Acceder a propiedades
.clave→ obtiene el valor de una clave..clave1.clave2→ acceso anidado..["clave con espacios"]→ si la clave tiene caracteres especiales.
echo '{"usuario": {"nombre": "Ana", "edad": 25}}' | jq '.usuario.nombre'
# "Ana"
Trabajar con arrays
.[]→ itera sobre los elementos del array..[indice]→ accede a un elemento por Ãndice (0-based)..[inicio:fin]→ slicing.
echo '["manzana", "pera", "uva"]' | jq '.[1]'
# "pera"
echo '["manzana", "pera", "uva"]' | jq '.[]'
# "manzana"
# "pera"
# "uva"
echo '["manzana", "pera", "uva"]' | jq '.[0:2]'
# ["manzana", "pera"]
Combinar filtros
Puedes encadenar filtros con el operador |.
echo '{"lista": [1,2,3]}' | jq '.lista | .[1]'
# 2
Transformaciones comunes
Seleccionar múltiples claves (objeto nuevo)
echo '{"nombre": "Luis", "edad": 40, "ciudad": "Madrid"}' | jq '{nombre, ciudad}'
# {
# "nombre": "Luis",
# "ciudad": "Madrid"
# }
Crear arrays con valores
echo '{"nombre": "Luis", "edad": 40}' | jq '[.nombre, .edad]'
# ["Luis", 40]
Mapear arrays (map)
echo '[1,2,3]' | jq 'map(. * 2)'
# [2,4,6]
Filtrar elementos de un array (select)
echo '[{"id":1,"activo":true}, {"id":2,"activo":false}]' | jq '.[] | select(.activo == true) | .id'
# 1
También puedes usar select con condiciones: > < >= <= == != y combinarlas con and / or.
Eliminar nulos
echo '[1, null, 2, null, 3]' | jq 'map(select(. != null))'
# [1,2,3]
Funciones útiles
length→ longitud de string, array u objeto.keys→ lista las claves de un objeto.has("clave")→ comprueba si existe una clave.add→ suma elementos de un array numérico.join(";")→ une array de strings con separador.
echo '{"a":1, "b":2}' | jq 'keys'
# ["a","b"]
Entrada/salida
Leer de un archivo
jq '.usuarios' datos.json
Salida compacta vs formateada
Por defecto jq formatea la salida. Para compacta (una lÃnea) usa -c:
jq -c '.usuarios' datos.json
Colorear salida (por defecto si es terminal)
Para forzar color: jq -C, para desactivar: jq -M.
Ejemplos prácticos
1. Extraer todos los nombres de usuarios de un array
echo '[{"nombre":"Ana"}, {"nombre":"Luis"}]' | jq '.[].nombre'
# "Ana"
# "Luis"
2. Contar elementos de un array
echo '[1,2,3]' | jq 'length'
# 3
3. Obtener valores únicos
echo '[1,2,2,3,3,3]' | jq 'unique'
# [1,2,3]
4. Transformar objetos (renombrar clave)
echo '{"old": 123}' | jq '{new: .old}'
# {"new": 123}
5. Crear tabla desde JSON (CSV)
echo '[{"nombre":"Ana","edad":30},{"nombre":"Luis","edad":25}]' | jq -r '.[] | [.nombre, .edad] | @csv'
# "Ana",30
# "Luis",25
La opción -r da salida raw (sin comillas adicionales). @csv formatea como CSV.
6. Combinar múltiples archivos JSON
jq -s '.[0] * .[1]' archivo1.json archivo2.json
-s (slurp) lee todos los archivos y los mete en un array.
Trucos avanzados
Variables
Puedes usar --arg para pasar variables del shell:
nombre="Pedro"
echo '{"nombre": "Pedro", "edad":20}' | jq --arg n "$nombre" 'select(.nombre == $n)'
# Devuelve el objeto completo si coincide
Reducir (reduce)
Para cálculos complejos, como sumar valores agrupados.
Conclusión
jq es una navaja suiza para JSON. Con estos filtros básicos ya puedes resolver la mayorÃa de necesidades: consultar, filtrar, transformar y exportar datos. Practica con tus propios JSON y consulta siempre la ayuda (man jq o jq --help).
¿Tienes algún caso concreto que quieras resolver? ¡Pregunta sin problema!