Skip to content

Grep - Búsqueda Avanzada de Texto

El comando grep es una herramienta fundamental para la búsqueda de patrones en texto. Esta guía cubre desde uso básico hasta técnicas avanzadas con expresiones regulares para pentesting y análisis forense.

Terminal window
grep [OPCIONES] PATRÓN [ARCHIVO...]
Terminal window
-i, --ignore-case # Ignorar mayúsculas y minúsculas
-v, --invert-match # Mostrar líneas que NO coinciden
-w, --word-regexp # Buscar palabras completas
-x, --line-regexp # Buscar líneas completas
-F, --fixed-strings # Interpretar patrón como cadena literal
-E, --extended-regexp # Usar expresiones regulares extendidas
-P, --perl-regexp # Usar expresiones regulares de Perl
Terminal window
-n, --line-number # Mostrar número de línea
-H, --with-filename # Mostrar nombre del archivo
-h, --no-filename # No mostrar nombre del archivo
-c, --count # Contar coincidencias
-l, --files-with-matches # Solo nombres de archivos con coincidencias
-L, --files-without-match # Solo nombres de archivos sin coincidencias
-o, --only-matching # Solo mostrar la parte que coincide
Terminal window
-A NUM, --after-context=NUM # Mostrar NUM líneas después
-B NUM, --before-context=NUM # Mostrar NUM líneas antes
-C NUM, --context=NUM # Mostrar NUM líneas antes y después
Terminal window
-r, --recursive # Buscar recursivamente en directorios
-R, --dereference-recursive # Seguir enlaces simbólicos
--include=PATRÓN # Solo buscar en archivos que coincidan
--exclude=PATRÓN # Excluir archivos que coincidan
--exclude-dir=PATRÓN # Excluir directorios que coincidan
Terminal window
. # Cualquier carácter (excepto nueva línea)
^ # Inicio de línea
$ # Final de línea
* # Cero o más repeticiones del carácter anterior
+ # Una o más repeticiones (con -E)
? # Cero o una repetición (con -E)
[] # Clase de caracteres
[^] # Clase de caracteres negada
\ # Escape de metacaracteres
Terminal window
[:alnum:] # Caracteres alfanuméricos
[:alpha:] # Caracteres alfabéticos
[:digit:] # Dígitos
[:lower:] # Minúsculas
[:upper:] # Mayúsculas
[:space:] # Espacios en blanco
[:punct:] # Signos de puntuación
Terminal window
# Buscar palabra en archivo
grep "error" /var/log/syslog
# Búsqueda insensible a mayúsculas
grep -i "ERROR" /var/log/syslog
# Buscar palabra completa
grep -w "root" /etc/passwd
# Buscar líneas que NO contengan el patrón
grep -v "^#" /etc/ssh/sshd_config
Terminal window
# Mostrar 3 líneas antes y después
grep -C 3 "Failed password" /var/log/auth.log
# Mostrar 5 líneas después
grep -A 5 "kernel panic" /var/log/syslog
# Mostrar 2 líneas antes
grep -B 2 "segfault" /var/log/syslog
Terminal window
# Direcciones IP
grep -E "([0-9]{1,3}\.){3}[0-9]{1,3}" archivo.log
# Direcciones de email
grep -E "[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}" archivo.txt
# URLs HTTP/HTTPS
grep -E "https?://[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}[/a-zA-Z0-9._-]*" archivo.txt
# Números de teléfono (formato US)
grep -E "\([0-9]{3}\) [0-9]{3}-[0-9]{4}" archivo.txt
# Fechas (formato YYYY-MM-DD)
grep -E "[0-9]{4}-[0-9]{2}-[0-9]{2}" archivo.log
# Hashes MD5
grep -E "[a-f0-9]{32}" archivo.txt
# Hashes SHA1
grep -E "[a-f0-9]{40}" archivo.txt
# Direcciones MAC
grep -E "([0-9a-fA-F]{2}:){5}[0-9a-fA-F]{2}" archivo.log
Terminal window
# Líneas que empiecen con mayúscula
grep "^[A-Z]" archivo.txt
# Líneas que terminen con punto
grep "\.$" archivo.txt
# Líneas vacías
grep "^$" archivo.txt
# Líneas con al menos 3 dígitos consecutivos
grep "[0-9]{3,}" archivo.txt
# Palabras de 4 a 8 caracteres
grep -E "\b[a-zA-Z]{4,8}\b" archivo.txt
Terminal window
# Intentos de login fallidos
grep "Failed password" /var/log/auth.log
# Logins exitosos de root
grep "Accepted.*root" /var/log/auth.log
# Conexiones SSH desde IPs específicas
grep "sshd.*192\.168\." /var/log/auth.log
# Intentos de escalada de privilegios
grep -i "sudo.*COMMAND" /var/log/auth.log
# Actividad de usuarios específicos
grep "user.*john" /var/log/auth.log
Terminal window
# Buscar passwords en archivos de configuración
grep -r -i "password" /etc/ 2>/dev/null
# Buscar claves API
grep -r -E "api[_-]?key" /var/www/ 2>/dev/null
# Buscar tokens de autenticación
grep -r -E "token|secret|key" /home/ 2>/dev/null
# Buscar hashes de contraseñas
grep -E "\$[0-9]\$" /etc/shadow
Terminal window
# Buscar IPs sospechosas en logs de Apache
grep -E "([0-9]{1,3}\.){3}[0-9]{1,3}" /var/log/apache2/access.log
# Buscar códigos de error HTTP
grep " 40[0-9] \| 50[0-9] " /var/log/apache2/access.log
# Buscar intentos de inyección SQL
grep -i "union.*select\|drop.*table" /var/log/apache2/access.log
# Buscar ataques XSS
grep -i "script.*alert\|javascript:" /var/log/apache2/access.log
Terminal window
# Buscar procesos sospechosos
ps aux | grep -E "(nc|netcat|ncat)"
# Buscar conexiones de red activas
netstat -tulpn | grep -E ":(22|80|443|3389)"
# Buscar archivos modificados recientemente
find / -mtime -1 2>/dev/null | grep -v "/proc\|/sys"
Terminal window
# Buscar múltiples patrones (OR)
grep -E "error|warning|critical" /var/log/syslog
# Buscar múltiples patrones en archivos específicos
grep -E "admin|root" /etc/passwd /etc/group
# Usar archivo con patrones
echo -e "error\nwarning\ncritical" > patterns.txt
grep -f patterns.txt /var/log/syslog
Terminal window
# Buscar IPs que NO sean de red local
grep -E "([0-9]{1,3}\.){3}[0-9]{1,3}" access.log | \
grep -v -E "^192\.168\.|^10\.|^172\.(1[6-9]|2[0-9]|3[01])\."
# Buscar errores excluyendo ciertos tipos
grep -i error /var/log/syslog | grep -v -E "timeout|connection"
# Buscar líneas con formato específico
grep -E "^[0-9]{4}-[0-9]{2}-[0-9]{2}.*ERROR" application.log
Terminal window
# Usar grep binario para archivos grandes
LC_ALL=C grep "pattern" largefile.log
# Limitar búsqueda a primeras coincidencias
grep -m 10 "pattern" largefile.log
# Usar búsqueda de cadena fija para mejor rendimiento
grep -F "literal_string" largefile.log
# Excluir archivos binarios
grep -I "pattern" *
Terminal window
# Buscar en archivos gzip
zgrep "pattern" file.gz
# Buscar en archivos bzip2
bzgrep "pattern" file.bz2
# Buscar en archivos xz
xzgrep "pattern" file.xz
#!/bin/bash
LOG_FILE="/var/log/auth.log"
REPORT_FILE="security_report.txt"
echo "Reporte de Seguridad - $(date)" > $REPORT_FILE
echo "=================================" >> $REPORT_FILE
echo "Intentos de login fallidos:" >> $REPORT_FILE
grep "Failed password" $LOG_FILE | wc -l >> $REPORT_FILE
echo "IPs con más intentos fallidos:" >> $REPORT_FILE
grep "Failed password" $LOG_FILE | \
grep -oE "([0-9]{1,3}\.){3}[0-9]{1,3}" | \
sort | uniq -c | sort -nr | head -10 >> $REPORT_FILE
Terminal window
smart_grep() {
local pattern="$1"
local path="${2:-.}"
# Buscar en archivos de texto comunes
find "$path" -type f \( -name "*.log" -o -name "*.txt" -o -name "*.conf" \) \
-exec grep -l "$pattern" {} \; 2>/dev/null
# Buscar en archivos comprimidos
find "$path" -type f -name "*.gz" \
-exec zgrep -l "$pattern" {} \; 2>/dev/null
}
Terminal window
# Buscar evidencia de exfiltración de datos
grep -r -E "(wget|curl|scp|rsync).*\.(zip|tar|gz)" /var/log/
# Buscar comandos ejecutados por usuarios
grep -E "COMMAND.*(/bin/|/usr/bin/)" /var/log/auth.log
# Buscar modificaciones de archivos críticos
grep -E "(chmod|chown|mv|rm).*(/etc/|/bin/)" /var/log/syslog
Terminal window
# Buscar strings sospechosos en binarios
strings suspicious_file | grep -E "(password|admin|backdoor)"
# Buscar patrones de shellcode
grep -aoE "\\x[0-9a-f]{2}" suspicious_file
# Buscar URLs embebidas
strings suspicious_file | grep -E "https?://"

Nota de Rendimiento: Para archivos muy grandes, considera usar ripgrep (rg) o ag (the silver searcher) como alternativas más rápidas a grep tradicional.

Nota de Seguridad: Al buscar en logs del sistema, ten cuidado de no exponer información sensible en la salida de tus comandos.