Ejemplos Prácticos en Terminal
Ahora combinemos todo lo aprendido con ejemplos reales usando grep.
Repaso: Banderas de grep
| Bandera | Significado |
|---|---|
-E |
Regex extendido (permite +, ?, {}, |) |
-i |
Ignorar mayúsculas/minúsculas |
-o |
Mostrar SOLO la parte que coincide |
-n |
Mostrar número de línea |
-v |
Invertir (mostrar líneas que NO coinciden) |
-c |
Contar coincidencias |
-P |
Regex de Perl (para \d, \w, etc.) |
Ejemplo 1: Buscar Números
Crear archivo de prueba
cat << 'EOF' > datos.txt
Juan tiene 25 años
Maria tiene 30 años
El precio es $100
Código: ABC123
Teléfono: 555-1234
Sin números aquí
EOF
Encontrar líneas con números
grep "[0-9]" datos.txt
Salida:
Juan tiene 25 años
Maria tiene 30 años
El precio es $100
Código: ABC123
Teléfono: 555-1234
Extraer SOLO los números
grep -oE "[0-9]+" datos.txt
Salida:
25
30
100
123
555
1234
Ejemplo 2: Validar Formatos
Archivo de emails
cat << 'EOF' > emails.txt
juan@gmail.com
maria@empresa.mx
invalido@
@sinusuario.com
test@dominio.co
no-es-email
user.name@sub.domain.org
EOF
Patrón básico de email
grep -E "^[a-zA-Z0-9.]+@[a-zA-Z0-9.]+\.[a-zA-Z]+$" emails.txt
Salida:
juan@gmail.com
maria@empresa.mx
test@dominio.co
user.name@sub.domain.org
Desglose del patrón
^[a-zA-Z0-9.]+ → Inicio: uno o más caracteres alfanuméricos o punto
@ → Arroba literal
[a-zA-Z0-9.]+ → Uno o más caracteres para el dominio
\. → Punto literal (escapado)
[a-zA-Z]+$ → Extensión: una o más letras al final
Ejemplo 3: Buscar al Inicio y Final
Archivo de log
cat << 'EOF' > log.txt
ERROR: Conexión fallida
INFO: Usuario conectado
ERROR: Timeout
WARNING: Memoria baja
INFO: Proceso completado
ERROR: Archivo no encontrado
EOF
Líneas que empiezan con ERROR
grep "^ERROR" log.txt
Salida:
ERROR: Conexión fallida
ERROR: Timeout
ERROR: Archivo no encontrado
Líneas que terminan con “ado”
grep "ado$" log.txt
Salida:
INFO: Usuario conectado
INFO: Proceso completado
Ejemplo 4: Alternativas
Buscar múltiples palabras
grep -E "(ERROR|WARNING)" log.txt
Salida:
ERROR: Conexión fallida
ERROR: Timeout
WARNING: Memoria baja
ERROR: Archivo no encontrado
Buscar extensiones de archivo
cat << 'EOF' > archivos.txt
documento.pdf
imagen.jpg
foto.png
video.mp4
script.py
imagen.gif
documento.docx
EOF
grep -E "\.(jpg|png|gif)$" archivos.txt
Salida:
imagen.jpg
foto.png
imagen.gif
Ejemplo 5: Repeticiones Exactas
Códigos postales (5 dígitos)
cat << 'EOF' > direcciones.txt
Ciudad de México, 01000
Guadalajara, 44100
Monterrey, 64000
Código inválido: 123
Otro inválido: 123456
Puebla, 72000
EOF
grep -E "[0-9]{5}" direcciones.txt
Salida:
Ciudad de México, 01000
Guadalajara, 44100
Monterrey, 64000
Otro inválido: 123456
Puebla, 72000
Solo exactamente 5 dígitos (no 6)
grep -oE "\b[0-9]{5}\b" direcciones.txt
Salida:
01000
44100
64000
72000
(\b es “word boundary” - límite de palabra)
Ejemplo 6: Negación
Encontrar líneas SIN números
grep -v "[0-9]" datos.txt
Salida:
Sin números aquí
Caracteres que NO son letras
echo "Hola! ¿Cómo estás? 123" | grep -oE "[^a-zA-ZáéíóúÁÉÍÓÚ ]"
Salida:
!
¿
?
1
2
3
Ejemplo 7: Patrones Comunes
Números de teléfono (formato XXX-XXXX)
cat << 'EOF' > telefonos.txt
Casa: 555-1234
Oficina: 555-5678
Móvil: 5551234567
Incompleto: 55-123
Correcto: 123-4567
EOF
grep -E "[0-9]{3}-[0-9]{4}" telefonos.txt
Salida:
Casa: 555-1234
Oficina: 555-5678
Correcto: 123-4567
Fechas formato DD/MM/AAAA
cat << 'EOF' > fechas.txt
Fecha: 25/12/2024
Inválido: 5/1/24
Correcto: 01/01/2025
Mal formato: 2024-12-25
También válido: 31/12/2023
EOF
grep -E "[0-9]{2}/[0-9]{2}/[0-9]{4}" fechas.txt
Salida:
Fecha: 25/12/2024
Correcto: 01/01/2025
También válido: 31/12/2023
Ejemplo 8: Combinar con Otros Comandos
Contar errores en un log
grep -c "^ERROR" log.txt
Salida:
3
Ver contexto (líneas antes/después)
# 2 líneas después de cada ERROR
grep -A 2 "^ERROR" log.txt
Pipeline: buscar y procesar
# Extraer todos los emails y ordenarlos
grep -oE "[a-zA-Z0-9.]+@[a-zA-Z0-9.]+\.[a-zA-Z]+" archivo.txt | sort | uniq
Casos Especiales (Edge Cases)
Buscar un punto literal
# MAL: . significa "cualquier caracter"
grep "archivo.txt" lista.txt
# BIEN: escapar el punto
grep "archivo\.txt" lista.txt
Buscar al inicio CON caracteres especiales
# Buscar líneas que empiecen con $
grep "^\$" archivo.txt
# Buscar líneas que empiecen con [
grep "^\[" archivo.txt
Buscar corchetes literales
# Escapar los corchetes
grep "\[ERROR\]" log.txt
Errores Comunes
1. Olvidar -E para regex extendido
# FALLA: + no funciona sin -E
grep "a+" archivo.txt
# BIEN: usar -E
grep -E "a+" archivo.txt
# ALTERNATIVA: escapar
grep "a\+" archivo.txt
2. Confundir [] con ()
# [abc] = UN caracter: a, b, o c
# (abc) = la secuencia "abc"
echo "abc" | grep -E "[abc]" # Coincide (encuentra "a")
echo "abc" | grep -E "(abc)" # Coincide (encuentra "abc")
echo "cab" | grep -E "[abc]" # Coincide (encuentra "c")
echo "cab" | grep -E "(abc)" # NO coincide
3. ^ dentro vs fuera de []
# ^abc = línea que empieza con "abc"
# [^abc] = cualquier caracter EXCEPTO a, b, c
echo "xyz" | grep "^abc" # NO coincide
echo "xyz" | grep "[^abc]" # Coincide (x, y, z no son a, b, c)
Ejercicios Prácticos
Crea un archivo server.log:
2024-01-15 10:30:00 INFO User login: admin
2024-01-15 10:31:00 ERROR Database connection failed
2024-01-15 10:32:00 INFO Request from 192.168.1.100
2024-01-15 10:33:00 WARNING Memory usage: 85%
2024-01-15 10:34:00 ERROR Timeout after 30s
2024-01-15 10:35:00 INFO User logout: admin
- Extrae todas las líneas de ERROR
- Extrae solo las direcciones IP
- Extrae solo las fechas
- Cuenta cuántos errores hay
Crea un archivo con varios formatos y escribe regex para:
- Números de teléfono:
(XXX) XXX-XXXX - Códigos postales mexicanos:
XXXXX - URLs que empiecen con https
- Contraseñas con al menos una mayúscula, una minúscula y un número
Resumen de Patrones Útiles
| Patrón | Descripción |
|---|---|
[0-9]+ |
Uno o más dígitos |
[a-zA-Z]+ |
Una o más letras |
^palabra |
Línea que empieza con “palabra” |
palabra$ |
Línea que termina con “palabra” |
\.[a-z]+$ |
Extensión de archivo |
[0-9]{3}-[0-9]{4} |
Teléfono XXX-XXXX |
(opcion1|opcion2) |
Una u otra opción |