Búsqueda y Expresiones Regulares
grep, ripgrep (rg), find, sed, y awk - el conjunto de herramientas de búsqueda de texto de Linux que los desarrolladores de Python utilizan para buscar en logs, localizar archivos y transformar configuraciones de un solo uso en servidores.
Receta
rg "TaxCalculator" src/
rg -n "raise_for_status" --type py
find /var/log/myapp -name "*.log" -mtime +7
grep -E "ERROR|CRITICAL" /var/log/myapp/app.log | tail -50Cuándo usar esto:
- Encontrar la definición de un símbolo en un monorepósito de Python
- Buscar logs de producción por ID de traza
- Localizar archivos grandes u obsoletos antes de la limpieza
- Extracción rápida de campos de líneas CSV/log
Ejemplo de Trabajo
# Encuentra todos los TODO(FIXME) en fuentes de Python
rg -n "TODO|FIXME" -g "*.py" src/ tests/
# Encuentra la configuración que referencia el host antiguo de Redis
rg -l "redis://legacy" --glob "!uv.lock"
# Logs: errores de la última hora con ID de solicitud
journalctl -u billing-api --since "1 hour ago" | rg "request_id=550e8400"
# Elimina logs rotados obsoletos de más de 14 días (primero en modo de prueba)
find /var/log/billing-api -name "*.log.*" -mtime +14 -printLo que esto demuestra:
- Los filtros de tipo y glob de
rgreducen el ruido -llista solo archivos para la planificación de reemplazos masivosjournalctlcanalizado argpara buscar en logs estructuradosfind -printantes de-deletepor seguridad
Profundización
Cómo Funciona
- grep - Coincidencia de expresiones regulares orientada a líneas;
-rrecursivo (lento en árboles grandes). - ripgrep - Paralelo, consciente de gitignore, predeterminado para la búsqueda de código.
- find - Recorrido de directorios por nombre, tiempo, tamaño, tipo.
- sed - Editor de flujo para sustituir/eliminar líneas.
- awk - Procesamiento orientado a columnas.
Selector de Herramientas
| Tarea | Herramienta |
|---|---|
| Búsqueda de símbolos de código | rg pattern src/ |
| Logs JSON | jq (preferido) o rg en la clave |
| Archivo por nombre | find . -name '*.py' |
| Reemplazo in situ | sed -i.bak con copia de seguridad |
| Tercera columna CSV | awk -F, '{print $3}' |
Notas de Python
# Equivalente a rg para un archivo con números de línea
grep -n "def main" src/app/cli.py
# Encuentra marcadores de __init__.py vacíos
find src -name "__init__.py" -emptyErrores Comunes
grep -rdesde / - Tormenta de E/S y errores de permisos. Solución: siempre empezar desde el proyecto o/var/log/app.- sed -i sin copia de seguridad en producción - Configuración rota irrecuperable. Solución:
-i.bako editar localmente + desplegar. - Codicia de expresiones regulares -
sedincorrecto coincide con configuración multilínea. Solución: probar en una copia; preferirrgpara localizar + edición manual para archivos críticos. - Ignorar coincidencias binarias -
grepimprime "Binary file matches". Solución:rgogrep -I. - El locale rompe las clases de caracteres - Ordenación/coincidencia inesperada. Solución:
LC_ALL=Cpara logs ASCII. - Awk en JSON - Frágil ante objetos anidados. Solución:
jqpara logs JSON.
Alternativas
| Alternativa | Usar Cuando | No Usar Cuando |
|---|---|---|
| Búsqueda IDE | Refactor local | Logs de producción solo por SSH |
git grep | Solo archivos rastreados | Archivos generados o de log |
ag / ack | Entornos heredados | rg disponible |
| Script de Python | Análisis complejo | Un solo comando más rápido en shell |
Preguntas Frecuentes
¿rg o git grep?
rg por velocidad y reglas de ignorar; git grep al buscar solo instantáneas confirmadas en una revisión específica.
¿Búsqueda insensible a mayúsculas?
rg -i patrón o grep -i.
¿Expresión regular multilínea?
Modo multilínea rg -U para patrones entre líneas - usar con moderación.
¿mtime vs atime de find?
mtime cambio de contenido de archivo; atime acceso (a menudo deshabilitado en servidores por rendimiento).
¿sed GNU vs BSD en Mac?
El sed de macOS requiere una extensión de copia de seguridad sed -i '' - probar en el sistema operativo de destino.
¿Excluir venv de grep?
rg ignora automáticamente; para grep usar --exclude-dir=.venv.
¿Contar coincidencias?
rg -c patrón por archivo o rg patrón | wc -l.
¿Buscar logs comprimidos?
zgrep / zcat file.gz | rg patrón.
¿Eliminación paralela con find?
Evitar find -delete a gran escala sin una ejecución de prueba -print primero.
¿Regex en Python vs shell?
Preferir Python re en el código de la aplicación; regex de shell solo para operaciones únicas del operador.
Relacionado
- re - Expresiones Regulares - Regex de Python
- Pipes y Procesamiento de Texto - composición de herramientas
- Análisis de Logs y Texto - pipelines de logs
- Productividad en Shell - alias para búsqueda
Versiones de la pila: 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+.