Pipes y Procesamiento de Texto
Compón herramientas de Linux con pipes para filtrar logs, resumir exportaciones CSV y depurar producción - |, jq, awk, sort, y uniq antes de recurrir a un script de Python.
Receta
journalctl -u billing-api --since today | jq -r 'select(.level=="error") | .message' | sort | uniq -c | sort -nr | headCuándo usar esto:
- Mensajes de error Top N de logs JSON
- Conteo rápido de logs de acceso CSV
- Encadenamiento de
curl+jqpara pruebas de humo de API - Preparación de datos ad-hoc antes de pegar en una hoja de cálculo
Ejemplo de Trabajo
#!/usr/bin/env bash
set -euo pipefail
# Latencia p95 de la API a partir de logs de acceso estructurados
curl -sf http://localhost:8000/metrics 2>/dev/null | head -1 # omitir si no es prometheus
# Logs de aplicación JSON
journalctl -u billing-api --since "30 min ago" -o cat \
| jq -c 'select(.event=="request_complete")' \
| jq -s 'map(.duration_ms) | sort | .[length * 0.95 | floor]'
# CSV: principales clientes por gasto
cut -d, -f2,5 orders.csv | tail -n +2 | sort -t, -k2 -nr | head -10Lo que esto demuestra:
pipefailfalla el script sijqgenera un error en una línea JSON incorrectajq -s"traga" el stream en un array para cálculos de percentilescut+sortpara analíticas CSV simples sin pandas- Filtro del campo
eventde logs estructurados
Inmersión Profunda
Cómo Funciona
- Pipe - Conecta la salida estándar (stdout) del comando de la izquierda a la entrada estándar (stdin) del de la derecha.
- Buffering - Las pipelines largas pueden bloquearse hasta que el buffer se llene; usa
stdbufsi es necesario. - jq - Lenguaje de filtrado JSON;
-ccompacta un objeto por línea en el stream. - Sustitución de procesos -
<(cmd)alimenta la salida del comando como un archivo paradiff/compare.
Patrones de Pipeline
| Objetivo | Pipeline |
|---|---|
| Histograma de errores | ... | jq select(.level) | sort | uniq -c |
| IPs principales | awk '{print $1}' access.log | sort | uniq -c | sort -nr |
| Filtro de cola en vivo | tail -f app.log | rg --line-buffered ERROR |
| Fusionar archivos ordenados | sort -m file1 file2 |
Notas de Python
# Cuando la pipeline se vuelve difícil de manejar, un one-liner de Python está bien
journalctl -u billing-api -n 500 | python -c "
import sys, json
for line in sys.stdin:
try:
o=json.loads(line)
if o.get('level')=='error': print(o['message'])
except json.JSONDecodeError: pass
"Trampas Comunes
- Falta de
pipefail- Fallo silencioso a mitad de la pipeline. Solución:set -o pipefailen scripts bash. jqen líneas no JSON - Toda la pipeline se detiene. Solución:jq -R 'fromjson? | select(.)'o filtrar primero conrg.- Localización rompiendo
sort- Orden inesperado de CSV. Solución:LC_ALL=C sort. jq -sgigante en memoria - Agotamiento de memoria (OOM) en logs de gigabytes. Solución:awken streaming o lectura por fragmentos en Python.- Infierno de comillas en pipes anidadas - Errores de escape. Solución: Mover a
bin/analyze_logs.shen el repositorio. - Mojibake UTF-8 -
LANGincorrecto. Solución:export LANG=en_US.UTF-8.
Alternativas
| Alternativa | Usar Cuando | No Usar Cuando |
|---|---|---|
| One-liner de pandas | CSV complejo en notebook | Triaje rápido por SSH |
| DuckDB CLI | SQL sobre archivos CSV/parquet | Logs JSON ya en journald |
| UI de agregador de logs | Datadog/Splunk/Loki | Sin SaaS en producción air-gapped |
| Procesador structlog de Python | Transformación repetible | Incidente de medianoche único |
Preguntas Frecuentes
¿jq o grep en JSON?
jq entiende la estructura; grep omite campos anidados y falla al reordenar.
¿Cómo depurar una pipeline?
Inserta tee /tmp/debug.jsonl entre etapas para inspeccionar la salida intermedia.
¿`parallel` para muchos archivos?
find logs -name '*.jsonl' -print0 | xargs -0 -P4 jq ... para procesamiento paralelo de fragmentos.
¿`awk` FS para TSV?
awk -F'\t' '{print $1}' - especifica explícitamente el delimitador.
¿`sponge` para in-place?
cmd | sponge file de moreutils - más seguro que redirigir al mismo archivo.
¿`column` para tablas bonitas?
echo "a b c" | column -t para salida alineada legible por humanos.
¿`tail -F` vs `-f`?
-F reintenta cuando el archivo de log se rota - mejor para entornos con logrotate.
¿`wc -l` en gzip?
zcat file.gz | wc -l o rg -c '' por archivo.
¿Python `-c` vs archivo de script?
Promover a módulo scripts/ con tests cuando se usa dos veces.
¿Equivalente en PowerShell de Windows?
Este documento está dirigido a servidores Linux; para desarrollo en Windows, usa WSL para las mismas pipelines.
Relacionado
- Búsqueda y Regex -
rgyfind - Análisis de Logs y Texto - Análisis en Python
- Errores y Logging - campos estructurados
Versiones de Stack: Esta página fue escrita para Python 3.14.0 (estable 3.14, mantenimiento 3.13), FastAPI 0.115+, Django 5.2, Flask 3.1, Pydantic 2, PyTorch 2.6+, pandas 2.2+, Polars 1.x, ruff 0.9+, y uv 0.6+.