Anexo E: Búsqueda y Procesamiento de Texto - grep, find, sed, awk
Anexo E: Búsqueda y Procesamiento de Texto - grep, find, sed, awk
Introducción
Administrar servidores Linux significa constantemente buscar archivos y procesar texto. Desde logs enormes hasta archivos de configuración, necesitas poder encontrar y modificar información rápidamente.
Este anexo enseña las 4 herramientas más poderosas de Linux para procesamiento de texto:
- grep - Buscar líneas que coincidan con patrón
- find - Encontrar archivos por nombre, tamaño, fecha, etc
- sed - Edición de streams (modificar texto en scripts)
- awk - Procesamiento de columnas de texto
🗺️ En este anexo aprenderás:
- Búsqueda básica y avanzada con grep
- Encontrar archivos específicos con find
- Editar y reemplazar texto con sed
- Procesar columnas con awk
- Piping y combinación de herramientas
- Casos de uso reales en Abacom
⏱️ Duración estimada: 2 horas de práctica
💡 Herramientas de Búsqueda en Diferentes SOs
BASH
# Linux tiene grep, find, sed, awk nativas y optimizadas
# Buscar en archivo
$ grep "error" /var/log/syslog
$ grep -r "error" /var/log # Recursivo
# Encontrar archivos
$ find / -name "*.log" -type f
$ find /home -user diego -type d
# Editar con sed
$ sed 's/error/ERROR/g' archivo.txt
$ sed -i 's/old/new/g' archivo.txt # In-place
# Procesar columnas con awk
$ ps aux | awk '{print $1, $2, $3}'
$ cat datos.csv | awk -F, '{sum += $2} END {print sum}'Disponibilidad:
- ✅ grep: Siempre disponible
- ✅ find: Siempre disponible
- ✅ sed: Siempre disponible (GNU sed)
- ✅ awk: Siempre disponible (GNU awk / gawk)
BASH
# macOS tiene las herramientas, pero versiones BSD (no GNU)
# Las opciones pueden ser ligeramente diferentes
# Buscar en archivo
$ grep "error" /var/log/system.log
$ grep -r "error" /var/log # Recursivo (igual)
# DIFERENCIA: BSD sed vs GNU sed
# macOS sed es BSD sed (menos opciones)
$ sed -i '' 's/error/ERROR/g' archivo.txt # '' es requerido en macOS
$ sed -i 's/error/ERROR/g' archivo.txt # Linux
# Mejor: Instalar GNU sed via Homebrew
$ brew install gnu-sed
$ gsed -i 's/error/ERROR/g' archivo.txt # GNU sed
# awk (BSD awk, pero compatible)
$ ps aux | awk '{print $1, $2, $3}'
$ cat datos.csv | awk -F, '{sum += $2} END {print sum}'
# find (similar a Linux)
$ find . -name "*.log" -type fDisponibilidad:
- ✅ grep: Disponible (BSD grep)
- ✅ find: Disponible (BSD find)
- ⚠️ sed: Disponible pero limitado (BSD sed)
- ✅ awk: Disponible (BSD awk)
- 💡 Recomendado: Instalar GNU tools via Homebrew
POWERSHELL
# Windows NO tiene grep, find, sed, awk nativamente
# Opciones:
# OPCIÓN 1: PowerShell (alternativas nativas)
PS> # Buscar en archivo
PS> Select-String -Path "C:\logs\error.log" -Pattern "error"
PS> # Encontrar archivos
PS> Get-ChildItem -Path "C:\" -Filter "*.log" -Recurse
PS> # Reemplazar en archivo
PS> (Get-Content "archivo.txt") -replace "old", "new" | Set-Content "archivo.txt"
PS> # Procesar columnas (similar a awk)
PS> Get-Process | Select-Object Name, CPU, Memory
# OPCIÓN 2: Git Bash (incluye grep, sed, awk)
$ grep "error" C:\logs\error.log
$ find C:\projects -name "*.log"
$ sed 's/error/ERROR/g' archivo.txt
# OPCIÓN 3: Windows Subsystem for Linux (WSL)
PS> wsl grep "error" /mnt/c/logs/error.log
PS> wsl find / -name "*.log"
# Acceso completo a herramientas LinuxDisponibilidad:
- ❌ grep: No nativo (via Git Bash o WSL)
- ❌ find: No nativo (via Git Bash o WSL)
- ❌ sed: No nativo (via Git Bash o WSL)
- ❌ awk: No nativo (via Git Bash o WSL)
- ✅ PowerShell equivalentes: Disponibles
- 🎯 Recomendado: Usar WSL o PowerShell nativo
Tabla comparativa: | Herramienta | Linux | macOS | Windows | |———–|——-|——-|———| | grep | ✅ GNU | ✅ BSD | ❌ (WSL/Git Bash) | | find | ✅ GNU | ✅ BSD | ❌ (WSL/Get-ChildItem) | | sed | ✅ GNU | ⚠️ BSD | ❌ (WSL/Get-Content) | | awk | ✅ GNU | ✅ BSD | ❌ (WSL/Select-Object) |
Recomendación para Abacom:
- Linux: Usar herramientas nativas (grep, find, sed, awk)
- macOS: Instalar
brew install gnu-sedpara compatibilidad - Windows: Usar WSL para acceso completo a herramientas Linux
Concepto 1: GREP - Buscar Texto en Archivos
Búsqueda Básica
BASH
# Buscar "error" en archivo
1grep "error" /var/log/syslog- 1
- grep “patrón” archivo busca todas las líneas que contienen “error”
Salida (solo líneas con “error”):
Jan 29 15:45:23 server kernel: [error] Failed to allocate memory
Jan 29 16:12:01 server nginx: [error] Connection refused
Jan 29 17:34:56 server php: [error] Undefined variable in script.php
Búsqueda Case-Insensitive
BASH
# Buscar "ERROR", "Error", "error" todo junto
1grep -i "error" /var/log/syslog- 1
- -i (ignore case) ignora mayúsculas/minúsculas
Contar Ocurrencias
BASH
# ¿Cuántas veces aparece "error"?
1grep -c "error" /var/log/syslog- 1
- -c (count) cuenta líneas coincidentes
Salida:
47
Hay 47 líneas con “error”.
Buscar en Múltiples Archivos
BASH
# Buscar "error" en TODOS los .log
1grep "error" /var/log/*.log- 1
- *.log wildcard que expande a todos los .log
Salida:
/var/log/syslog:Jan 29 15:45:23 server kernel: [error] Failed
/var/log/nginx.log:Jan 29 16:12:01 server nginx: [error] Connection
/var/log/apache2.log:Jan 29 17:34:56 server apache: [error] Forbidden
Mostrar Contexto (Líneas Alrededor)
BASH
- 1
- -C 3 (context) 3 líneas antes y después
- 2
- -B 2 (before), -A 2 (after)
Expresiones Regulares (Regex)
BASH
- 1
- ^ = inicio de línea
- 2
- $ = fin de línea
- 3
- -E (extended regex) permite | (o)
Buscar Archivos Recursivamente
BASH
- 1
- -r (recursive) busca en subcarpetas
- 2
- -n (number) muestra número de línea
Salida:
/home/diego/proyecto/main.py:45: TODO: Implementar autenticación
/home/diego/proyecto/utils.py:123: TODO: Optimizar función lenta
Invertir Búsqueda (NOT)
BASH
# Mostrar líneas SIN "error"
1grep -v "error" /var/log/syslog- 1
- -v (invert) muestra líneas que NO coinciden
Concepto 2: FIND - Encontrar Archivos
Buscar por Nombre
BASH
- 1
- -name “patrón” busca por nombre
- 2
- Sin -type f incluye directorios también
Buscar Solo Archivos o Directorios
BASH
- 1
- -type f = archivos
- 2
- -type d = directorios
Buscar por Tamaño
BASH
- 1
- +100M = mayor que 100 MB
- 2
- -1K = menor que 1 KB
- 3
- 5G = exactamente 5 GB
Buscar por Fecha
BASH
- 1
- -mtime -7 = últimos 7 días
- 2
- -mtime +30 = más de 30 días atrás
- 3
- -atime 0 = accedidos hoy
Ejecutar Comando en Resultados
BASH
- 1
- -delete elimina archivos encontrados
- 2
- -exec comando {} ; ejecuta comando en cada archivo
- 3
- {} es placeholder para nombre del archivo
Buscar Archivos Vacíos
BASH
- 1
- -empty archivos de 0 bytes
- 2
- -empty directorios sin contenido
Concepto 3: SED - Editor de Streams
Reemplazar Texto (Substitución)
BASH
- 1
- s/viejo/nuevo/ reemplaza (primera por línea)
- 2
- g = global (todas)
- 3
- i = case-insensitive
Usar Delimitador Diferente
BASH
- 1
- | como delimitador
- 2
- # como delimitador (también válido)
Eliminar Líneas
BASH
- 1
- 5d = delete línea 5
- 2
- 5,10d = delete rango
- 3
- /patrón/d = delete líneas que coincidan
- 4
- /^$/d = delete líneas vacías
Guardar Cambios a Archivo
BASH
# Mostrar en pantalla (no modifica archivo)
sed 's/viejo/nuevo/g' archivo.txt
# Guardar en nuevo archivo
sed 's/viejo/nuevo/g' archivo.txt > archivo_nuevo.txt
# Modificar archivo en lugar (in-place)
1sed -i 's/viejo/nuevo/g' archivo.txt
# Backup antes de modificar
2sed -i.bak 's/viejo/nuevo/g' archivo.txt- 1
- -i modifica el archivo original
- 2
- -i.bak crea backup antes de modificar
Inserciones y Adiciones
BASH
- 1
- 5i = insert antes (before)
- 2
- 5a = append después (after)
- 3
- $ = última línea
Concepto 4: AWK - Procesamiento de Columnas
Imprimir Columnas Específicas
BASH
- 1
- $1 = primera columna
- 2
- $1, $3 = columna 1 y 3
- 3
- $4, $1 = columna 4 y 1
Salida:
diego
carlos
ana
diego linux
carlos python
ana java
admin diego
developer carlos
engineer ana
Usar Delimitador Diferente
BASH
- 1
- -F: usa : como delimitador
- 2
- Imprimir UID (columna 3) y nombre (columna 1)
Condicionales con AWK
BASH
- 1
- $2 > 30 = columna 2 mayor que 30
- 2
- /patrón/ = líneas coincidentes
- 3
- NR==2 = línea número 2 (NR = Number of Record)
Operaciones Matemáticas
BASH
- 1
- $2 * $3 = precio × cantidad
- 2
- END = después de procesar todo, mostrar suma
Variables y Strings
BASH
- 1
- Concatenar strings con espacios
- 2
- -v var=valor define variable antes
💡 Ejemplos Prácticos Reales en Abacom
Ejemplo 1: Buscar y Contar Errores en Log
BASH
#!/bin/bash
# Analizar errores en /var/log/syslog
echo "=== REPORTE DE ERRORES ==="
echo
# Total de errores
echo "Total de errores:"
grep -c "error" /var/log/syslog
# Por tipo de error
echo
echo "Errores por tipo:"
grep "error" /var/log/syslog | awk -F'] ' '{print $2}' | sort | uniq -c | sort -rn | head -5
# Últimas 10 líneas con error
echo
echo "Últimas 10 ocurrencias:"
grep "error" /var/log/syslog | tail -10Ejemplo 2: Limpiar Logs Antiguos
BASH
#!/bin/bash
# Eliminar logs más antiguos de 30 días
echo "Eliminando logs antiguos..."
# Encontrar y eliminar
find /var/log -type f -name "*.log.*" -mtime +30 -delete
# Comprimir logs en rotación
find /var/log -type f -name "*.log" -mtime +7 -exec gzip {} \;
echo "✓ Limpieza completada"Ejemplo 3: Procesar Archivo CSV
BASH
#!/bin/bash
# Procesar CSV de usuarios y crear cuentas
# usuarios.csv
# diego,35,developer,active
# carlos,28,admin,inactive
# ana,32,engineer,active
echo "Creando cuentas de usuario..."
awk -F, '$4 == "active" {
print "sudo useradd -m -s /bin/bash " $1
}' usuarios.csv | bash
echo "✓ Usuarios creados"Ejemplo 4: Reporte de Uso de Disco
BASH
#!/bin/bash
# Generar reporte de disco
echo "=== REPORTE DE USO DE DISCO ==="
echo
# Ver particiones >80% lleno
echo "Particiones críticas (>80%):"
df -h | awk '$5 > 80 {print $1 ": " $5 " usado"}'
echo
echo "Top 5 carpetas más grandes:"
du -sh /* | sort -rh | head -5
echo
echo "Archivos grandes (>100MB):"
find / -type f -size +100M -exec ls -lh {} \; | awk '{print $5, $9}' | sort -rh | head -10Ejemplo 5: Combinar Herramientas (Pipe)
BASH
#!/bin/bash
# Pipeline complejo: buscar → procesar → reportar
# ¿Cuáles usuarios iniciaron sesión hoy?
echo "Usuarios que iniciaron sesión hoy:"
grep "$(date '+%b %d')" /var/log/auth.log | \
grep "Accepted password" | \
awk '{print $1, $2, $3}' | \
sort | uniq
# Desglose:
# 1. grep fecha actual de auth.log
# 2. grep solo líneas de "Accepted password"
# 3. awk extrae fecha y hora
# 4. sort ordena
# 5. uniq elimina duplicados🔧 Tabla Rápida: Combinaciones Poderosas
| Tarea | Comando |
|---|---|
| Buscar archivos grandes | find / -type f -size +100M |
| Buscar texto recursivo | grep -rn “TODO” /home/ |
| Reemplazar en lote | **find . -name “*.txt” -exec sed -i ‘s/viejo/nuevo/g’ {} ;** |
| Contar líneas en archivos | **find . -name “*.py” -exec wc -l {} + | tail -1** |
| Listar usuarios sistema | awk -F: ‘{print $1}’ /etc/passwd |
| Archivos modificados hoy | find / -type f -mtime 0 |
| Ver top 10 usuarios por size | du -sh /home/* | sort -rh | head -10 |
⚠️ Errores Comunes
Error 1: Olvidar escapar caracteres especiales
BASH
# MALO: . significa "cualquier carácter"
grep "archivo.txt" /var/log/syslog
# BUENO: \. es punto literal
grep "archivo\.txt" /var/log/syslogError 2: -i in-place sin backup
BASH
# MALO: Si hay error, perdiste archivo
sed -i 's/viejo/nuevo/g' archivo.txt
# BUENO: Backup primero
sed -i.bak 's/viejo/nuevo/g' archivo.txtError 3: Olvidar comillas
BASH
# MALO: Se expande wildcard antes
awk $1 archivo.txt
# BUENO: Comillas protegen variables
awk '{print $1}' archivo.txt🎓 Quiz: Verificar Comprensión
a) No hay diferencia
b) -r busca recursivamente en directorios (Correcto ✓)
c) -r usa regex
d) -r es más rápido
Explicación: sin -r grep solo busca en un archivo. Con -r busca en carpeta y subcarpetas.
a) sed '/^$/d' archivo.txt (Correcto ✓)
b) sed 's/^$//' archivo.txt
c) sed 'd' archivo.txt
d) sed '/^/d' archivo.txt
Explicación: /^$/ coincide líneas que solo tienen inicio y fin (vacías). d las elimina.
a) Imprime toda la línea
b) Imprime 2 caracteres
c) Imprime la segunda columna (Correcto ✓)
d) Imprime línea 2
Explicación: $2 es la columna 2 (separada por espacios). NR==2 sería línea 2.
👨💻 Práctica: Scripts Útiles
Script 1: Buscar archivo por edad
BASH
#!/bin/bash
# Encontrar archivos sin modificar hace N días
DIAS=${1:-30}
echo "Buscando archivos no modificados en últimos $DIAS días..."
find /home -type f -mtime +$DIASScript 2: Reportar errores en logs
BASH
#!/bin/bash
# Generar reporte de errores
find /var/log -name "*.log" | while read FILE
do
COUNT=$(grep -c "error" "$FILE" 2>/dev/null || echo 0)
if [ $COUNT -gt 0 ]
then
echo "$FILE: $COUNT errores"
fi
doneScript 3: Backup selectivo
BASH
#!/bin/bash
# Respaldar solo archivos modificados hoy
BACKUP_DIR="/backup/diario"
mkdir -p "$BACKUP_DIR"
find /home -type f -mtime 0 | while read FILE
do
cp "$FILE" "$BACKUP_DIR/"
done
echo "✓ Respaldo completado: $(date)"📚 Recursos Adicionales
- Regular Expressions Tester: https://regex101.com/
- Sed Tutorial: https://www.gnu.org/software/sed/manual/sed.html
- AWK Manual: https://www.gnu.org/software/gawk/manual/gawk.html
- Find Command: https://linux.die.net/man/1/find
- Grep Patterns: https://www.gnu.org/software/grep/manual/grep.html
Conclusión
Ahora sabes: ✓ Buscar texto con grep (simple y avanzado) ✓ Encontrar archivos con find ✓ Editar archivos con sed ✓ Procesar columnas con awk ✓ Combinar herramientas con pipes
Para Abacom: Estas 4 herramientas son TU PAN DE CADA DÍA en administración. Dóminalas.
Próximo paso: Úsalas en scripts de mantenimiento y análisis de logs.