# Referencia Rápida de grep

*Coincidencia de patrones, regex, búsqueda recursiva, contexto, filtrado*

> Source: GNU grep Manual (gnu.org/software/grep) · MIT

## Uso básico

### Ejecutar grep

```
grep "pattern" file.txt            # buscar en archivo
grep "error" *.log                 # buscar en múltiples archivos
grep "hello" file1.txt file2.txt   # lista explícita de archivos
cat file.txt | grep "pattern"      # entrada por tubería
dmesg | grep -i "usb"              # filtrar salida de comando
```

### Flags comunes

| Command | Description |
|---------|-------------|
| `-i` | Búsqueda sin distinguir mayúsculas |
| `-v` | Invertir coincidencia — imprimir líneas que no coinciden |
| `-c` | Imprimir conteo de líneas coincidentes |
| `-n` | Mostrar números de línea |
| `-l` | Listar solo nombres de archivos con coincidencias |
| `-L` | Listar nombres de archivos sin coincidencias |
| `-w` | Coincidir solo palabras completas |
| `-x` | Coincidir solo líneas completas |

## Patrones regex

### Expresiones regulares básicas (BRE)

| Command | Description |
|---------|-------------|
| `.` | Cualquier carácter simple |
| `*` | Cero o más del elemento anterior |
| `^` | Inicio de línea |
| `$` | Fin de línea |
| `[abc]` | Clase de caracteres — cualquiera de a, b, c |
| `[^abc]` | Clase negada — cualquier cosa excepto a, b, c |
| `[a-z]` | Rango — letras minúsculas |
| `\<, \>` | Límites de palabra (GNU) |
| `\( \), \1` | Grupo de captura y referencia posterior |

### Ejemplos BRE

```
grep '^#' file.conf                # líneas que empiezan con #
grep 'error$' file.log             # líneas que terminan en error
grep '^$' file.txt                 # líneas en blanco
grep 'col[ou]r' file.txt           # coincidir color o colour
```

## Regex extendida

### Expresiones regulares extendidas (ERE)

| Command | Description |
|---------|-------------|
| `+` | Uno o más del elemento anterior |
| `?` | Cero o uno del elemento anterior |
| `{n}` | Exactamente n repeticiones |
| `{n,m}` | Entre n y m repeticiones |
| `(a\|b)` | Alternancia — coincidir a o b |
| `( )` | Agrupación (sin barra invertida) |

### Ejemplos ERE

```
grep -E '[0-9]{3}-[0-9]{4}' f     # patrón de número de teléfono
grep -E '(error|warn|fatal)' f     # múltiples patrones
grep -E '^[A-Z][a-z]+' f           # palabras en mayúscula
grep -P '\d{1,3}\.\d{1,3}' f      # regex Perl: fragmentos IP
```

## Líneas de contexto

### Ejemplos de contexto

```
grep -B 3 "error" app.log          # 3 líneas antes de la coincidencia
grep -A 5 "FAIL" test.log          # 5 líneas después de la coincidencia
grep -C 2 "crash" kern.log         # 2 líneas antes y después
grep --group-separator="---" -C 1 "err" f  # separador personalizado
```

### Flags de contexto

| Command | Description |
|---------|-------------|
| `-B N` | Mostrar N líneas antes de cada coincidencia |
| `-A N` | Mostrar N líneas después de cada coincidencia |
| `-C N` | Mostrar N líneas antes y después (contexto) |
| `--group-separator=str` | Separador entre grupos de coincidencias (por defecto `--`) |
| `--color=auto` | Resaltar coincidencias en el terminal |

## Búsqueda recursiva

### Ejemplos recursivos

```
grep -r "TODO" .                   # recursivo desde directorio actual
grep -rn "FIXME" src/              # recursivo con números de línea
grep -r --include="*.py" "import" .  # solo archivos .py
grep -r --exclude="*.log" "error" .  # omitir archivos .log
grep -r --exclude-dir=node_modules "require" .
```

### Flags recursivos

| Command | Description |
|---------|-------------|
| `-r / --recursive` | Buscar en directorios recursivamente |
| `-R` | Como `-r` pero sigue enlaces simbólicos |
| `--include=glob` | Buscar solo archivos que coincidan con el glob |
| `--exclude=glob` | Omitir archivos que coincidan con el glob |
| `--exclude-dir=dir` | Omitir directorios que coincidan con el nombre |
| `--include-dir=dir` | Buscar solo en directorios que coincidan |

## Conteo y listado

### Ejemplos de conteo y listado

```
grep -c "error" *.log              # contar coincidencias por archivo
grep -l "TODO" src/*.py            # listar archivos con TODOs
grep -L "test" src/*.py            # archivos sin "test"
grep -o "http[^ ]*" page.html      # extraer solo las partes coincidentes
grep -c '' file.txt                # contar total de líneas (como wc -l)
```

### Flags de salida

| Command | Description |
|---------|-------------|
| `-c` | Imprimir conteo de líneas coincidentes por archivo |
| `-l` | Imprimir solo nombres de archivos con coincidencias |
| `-L` | Imprimir solo nombres de archivos sin coincidencias |
| `-o` | Imprimir solo las partes coincidentes de las líneas |
| `-H / -h` | Mostrar / ocultar prefijo de nombre de archivo |
| `-Z` | Salida delimitada por nulo (para xargs -0) |

## Coincidencia inversa

### Invertir y excluir

```
grep -v "^#" config.conf           # eliminar líneas de comentarios
grep -v "^$" file.txt              # eliminar líneas en blanco
grep -v -e "debug" -e "trace" app.log  # excluir dos patrones
grep -v "pattern" f | grep "other" # cadena: NO A, luego B
```

### Estrategias de filtrado

| Command | Description |
|---------|-------------|
| `-v` | Invertir coincidencia — seleccionar líneas que no coinciden |
| `-v with -e` | Excluir múltiples patrones |
| `pipe chain` | Encadenar llamadas grep para filtrado complejo |
| `grep -v '^$' \| grep -v '^#'` | Eliminar líneas en blanco y comentarios |
| `-v with -c` | Contar líneas que no coinciden |

## Múltiples patrones

### Ejemplos de múltiples patrones

```
grep -e "error" -e "warning" app.log
grep -E "error|warning|fatal" app.log
grep -f patterns.txt file.txt       # patrones desde archivo
grep -w -e "GET" -e "POST" access.log
```

### Opciones de patrones

| Command | Description |
|---------|-------------|
| `-e pattern` | Especificar un patrón (usar múltiples veces) |
| `-f file` | Leer patrones desde archivo (uno por línea) |
| `-E 'a\|b\|c'` | Alternancia ERE para múltiples patrones |
| `-F` | Cadenas fijas — sin regex, coincidencia más rápida |
| `-G` | Regex básica (modo por defecto) |
| `-P` | Regex compatible con Perl (PCRE) |

## Rendimiento

### Consejos de rendimiento

| Command | Description |
|---------|-------------|
| `-F (fgrep)` | Modo de cadena fija — más rápido para cadenas literales |
| `LC_ALL=C grep` | Omitir locale para 2-10x de velocidad en datos ASCII |
| `--include/--exclude` | Reducir archivos buscados antes de abrir |
| `-m N` | Detener tras N coincidencias por archivo |
| `-q` | Modo silencioso — salir en la primera coincidencia (para scripts) |
| `ripgrep (rg)` | Reemplazo directo; más rápido en repos grandes |

### Ejemplos de rendimiento

```
LC_ALL=C grep -F "exact string" huge.log
grep -r -m 1 "needle" /var/log/     # detener tras el primer resultado
grep -rq "pattern" . && echo "found" # prueba booleana
grep -r --include="*.go" "func main" .
```

## Patrones comunes

### One-liners

```
grep -rn "TODO\|FIXME\|HACK" src/      # encontrar marcadores de código
grep -oP '(?<=")[^"]+(?=")' f           # extraer cadenas entre comillas
grep -E '^\s*$' f | wc -l              # contar líneas en blanco
grep -c '' *.py | sort -t: -k2 -rn     # ordenar archivos por número de líneas
grep -rn --include="*.yaml" "password" . # auditar en busca de secretos
```

### Recetas

| Command | Description |
|---------|-------------|
| `Direcciones IP` | `grep -oE '[0-9]{1,3}(\.[0-9]{1,3}){3}'` |
| `Direcciones de email` | `grep -oE '[a-zA-Z0-9._%+-]+@[a-z.-]+'` |
| `URLs` | `grep -oE 'https?://[^ ]+'` |
| `Líneas entre marcadores` | `grep -A999 'START' f \| grep -B999 'END'` |
| `Coincidencias únicas` | `grep -oE 'pattern' f \| sort -u` |
| `Contar por patrón` | `grep -c 'pat1' f; grep -c 'pat2' f` |
