Pipes & Processamento de Texto
Componha ferramentas Linux com pipes para filtrar logs, resumir exports CSV e depurar produção - |, jq, awk, sort e uniq antes de recorrer a um script Python.
Receita
journalctl -u billing-api --since today | jq -r 'select(.level=="error") | .message' | sort | uniq -c | sort -nr | headQuando usar isso:
- Principais N mensagens de erro de logs JSON
- Contagens rápidas de logs de acesso CSV
- Encadear
curl+jqpara smoke tests de API - Preparação de dados ad-hoc antes de colar em uma planilha
Exemplo de Trabalho
#!/usr/bin/env bash
set -euo pipefail
# Latência da API p95 a partir de logs de acesso estruturados
curl -sf http://localhost:8000/metrics 2>/dev/null | head -1 # pula se não for prometheus
# Logs de aplicação 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: principais clientes por gasto
cut -d, -f2,5 orders.csv | tail -n +2 | sort -t, -k2 -nr | head -10O que isso demonstra:
pipefailfalha o script sejqder erro em linha JSON inválidajq -scarrega o stream em um array para matemática de percentilcut+sortpara análises CSV simples sem pandas- Filtro de campo
eventde log estruturado
Mergulho Profundo
Como Funciona
- Pipe - Conecta o stdout do comando à esquerda ao stdin do comando à direita.
- Buffering - Pipelines longos podem bloquear até que o buffer encha - use
stdbufse necessário. - jq - Linguagem de filtro JSON;
-ccompacta um objeto por linha no stream. - Substituição de processo -
<(cmd)alimenta a saída do comando como um arquivo paradiff/compare.
Padrões de Pipeline
| Objetivo | Pipeline |
|---|---|
| Histograma de erros | ... | jq select(.level) | sort | uniq -c |
| IPs Principais | awk '{print $1}' access.log | sort | uniq -c | sort -nr |
| Filtro de cauda ao vivo | tail -f app.log | rg --line-buffered ERROR |
| Mesclar arquivos ordenados | sort -m file1 file2 |
Notas Python
# Quando o pipeline fica complicado, Python one-liner é aceitável
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
"Armadilhas
- Falta de
pipefail- Falha silenciosa no meio do pipeline. Correção:set -o pipefailem scripts bash. jqem linhas não JSON - Todo o pipeline para. Correção:jq -R 'fromjson? | select(.)'ou filtre comrgprimeiro.- Localidade quebrando
sort- Ordem CSV inesperada. Correção:LC_ALL=C sort. jq -scom uso massivo de memória - Falta de memória (OOM) em logs de gigabytes. Correção:awkem streaming ou leitura em blocos com Python.- Inferno de aspas em pipes aninhados - Erros de escape. Correção: Mova para
bin/analyze_logs.shno repositório. - Mojibake UTF-8 -
LANGincorreto. Correção:export LANG=en_US.UTF-8.
Alternativas
| Alternativa | Usar Quando | Não Usar Quando |
|---|---|---|
| One-liner pandas | CSV complexo em notebook | Triagem rápida via SSH |
| DuckDB CLI | SQL em arquivos CSV/parquet | Logs JSON já em journald |
| UI de agregador de logs | Datadog/Splunk/Loki | Sem SaaS em produção air-gapped |
| Processador structlog Python | Transformação repetível | Incidente pontual à meia-noite |
FAQs
jq ou grep em JSON?
jq entende a estrutura; grep perde campos aninhados e falha na reordenação.
Como depurar um pipeline?
Insira tee /tmp/debug.jsonl entre os estágios para inspecionar a saída intermediária.
parallel para muitos arquivos?
find logs -name '*.jsonl' -print0 | xargs -0 -P4 jq ... para processamento paralelo de blocos.
FS do awk para TSV?
awk -F'\t' '{print $1}' - especifique o delimitador explicitamente.
sponge para in-place?
cmd | sponge file do moreutils - mais seguro do que redirecionar para o mesmo arquivo.
column para tabelas bonitas?
echo "a b c" | column -t para saída alinhada legível por humanos.
tail -F vs -f?
-F tenta novamente quando o arquivo de log é rotacionado - melhor para ambientes com logrotate.
wc -l em gzip?
zcat file.gz | wc -l ou rg -c '' por arquivo.
Python -c vs arquivo de script?
Promova para o módulo scripts/ com testes quando usado duas vezes.
Equivalente no PowerShell do Windows?
Este documento visa servidores Linux; desenvolva no Windows usando WSL para os mesmos pipelines.
Relacionados
- Busca e Regex - rg e find
- Análise de Logs e Texto - Análise com Python
- Erros e Logging - campos estruturados
Versões do Stack: Esta página foi escrita para Python 3.14.0 (estável 3.14, manutenção 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+, e uv 0.6+.