# Riferimento Rapido grep

*Corrispondenza pattern, regex, ricerca ricorsiva, contesto, filtraggio*

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

## Utilizzo Base

### Eseguire grep

```
grep "pattern" file.txt            # cerca nel file
grep "error" *.log                 # cerca in più file
grep "hello" file1.txt file2.txt   # lista file esplicita
cat file.txt | grep "pattern"      # input da pipe
dmesg | grep -i "usb"              # filtra output comandi
```

### Flag Comuni

| Command | Description |
|---------|-------------|
| `-i` | Corrispondenza case-insensitive |
| `-v` | Inverti corrispondenza — stampa righe non corrispondenti |
| `-c` | Stampa il conteggio delle righe corrispondenti |
| `-n` | Mostra i numeri di riga |
| `-l` | Elenca solo i nomi dei file con corrispondenze |
| `-L` | Elenca i nomi dei file senza corrispondenze |
| `-w` | Corrisponde solo a parole intere |
| `-x` | Corrisponde solo a righe intere |

## Pattern Regex

### Espressioni Regolari Base (BRE)

| Command | Description |
|---------|-------------|
| `.` | Qualsiasi singolo carattere |
| `*` | Zero o più dell'elemento precedente |
| `^` | Inizio riga |
| `$` | Fine riga |
| `[abc]` | Classe caratteri — uno qualsiasi tra a, b, c |
| `[^abc]` | Classe negata — qualsiasi tranne a, b, c |
| `[a-z]` | Intervallo — lettere minuscole |
| `\<, \>` | Confini di parola (GNU) |
| `\( \), \1` | Gruppo di cattura e back-reference |

### Esempi BRE

```
grep '^#' file.conf                # righe che iniziano con #
grep 'error$' file.log             # righe che terminano con error
grep '^$' file.txt                 # righe vuote
grep 'col[ou]r' file.txt           # corrisponde a color o colour
```

## Regex Estesa

### Espressioni Regolari Estese (ERE)

| Command | Description |
|---------|-------------|
| `+` | Uno o più dell'elemento precedente |
| `?` | Zero o uno dell'elemento precedente |
| `{n}` | Esattamente n ripetizioni |
| `{n,m}` | Tra n e m ripetizioni |
| `(a\|b)` | Alternanza — corrisponde a a o b |
| `( )` | Raggruppamento (senza backslash) |

### Esempi ERE

```
grep -E '[0-9]{3}-[0-9]{4}' f     # pattern numero di telefono
grep -E '(error|warn|fatal)' f     # pattern multipli
grep -E '^[A-Z][a-z]+' f           # parole con iniziale maiuscola
grep -P '\d{1,3}\.\d{1,3}' f      # regex Perl: frammenti IP
```

## Righe di Contesto

### Esempi Contesto

```
grep -B 3 "error" app.log          # 3 righe prima della corrispondenza
grep -A 5 "FAIL" test.log          # 5 righe dopo la corrispondenza
grep -C 2 "crash" kern.log         # 2 righe prima e dopo
grep --group-separator="---" -C 1 "err" f  # separatore personalizzato
```

### Flag Contesto

| Command | Description |
|---------|-------------|
| `-B N` | Mostra N righe prima di ogni corrispondenza |
| `-A N` | Mostra N righe dopo ogni corrispondenza |
| `-C N` | Mostra N righe prima e dopo (contesto) |
| `--group-separator=str` | Separatore tra gruppi di corrispondenze (default `--`) |
| `--color=auto` | Evidenzia le corrispondenze nel terminale |

## Ricerca Ricorsiva

### Esempi Ricorsivi

```
grep -r "TODO" .                   # ricorsivo dalla directory corrente
grep -rn "FIXME" src/              # ricorsivo con numeri di riga
grep -r --include="*.py" "import" .  # solo file .py
grep -r --exclude="*.log" "error" .  # salta file .log
grep -r --exclude-dir=node_modules "require" .
```

### Flag Ricorsivi

| Command | Description |
|---------|-------------|
| `-r / --recursive` | Cerca ricorsivamente nelle directory |
| `-R` | Come `-r` ma segue i link simbolici |
| `--include=glob` | Cerca solo nei file corrispondenti al glob |
| `--exclude=glob` | Salta i file corrispondenti al glob |
| `--exclude-dir=dir` | Salta le directory corrispondenti al nome |
| `--include-dir=dir` | Cerca solo nelle directory corrispondenti |

## Conteggio ed Elenco

### Esempi Conteggio ed Elenco

```
grep -c "error" *.log              # conta corrispondenze per file
grep -l "TODO" src/*.py            # elenca file con TODO
grep -L "test" src/*.py            # file senza "test"
grep -o "http[^ ]*" page.html      # estrai solo le parti corrispondenti
grep -c '' file.txt                # conta righe totali (come wc -l)
```

### Flag Output

| Command | Description |
|---------|-------------|
| `-c` | Stampa il conteggio delle righe corrispondenti per file |
| `-l` | Stampa solo i nomi dei file con corrispondenze |
| `-L` | Stampa solo i nomi dei file senza corrispondenze |
| `-o` | Stampa solo le parti corrispondenti delle righe |
| `-H / -h` | Mostra / nasconde il prefisso del nome file |
| `-Z` | Output delimitato da null (per xargs -0) |

## Corrispondenza Inversa

### Inverti ed Escludi

```
grep -v "^#" config.conf           # rimuovi righe di commento
grep -v "^$" file.txt              # rimuovi righe vuote
grep -v -e "debug" -e "trace" app.log  # escludi due pattern
grep -v "pattern" f | grep "other" # catena: NON A, poi B
```

### Strategie di Filtraggio

| Command | Description |
|---------|-------------|
| `-v` | Inverti corrispondenza — seleziona righe non corrispondenti |
| `-v con -e` | Escludi pattern multipli |
| `catena pipe` | Concatena chiamate grep per filtraggio complesso |
| `grep -v '^$' \| grep -v '^#'` | Rimuovi righe vuote e commenti |
| `-v con -c` | Conta righe non corrispondenti |

## Pattern Multipli

### Esempi Pattern Multipli

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

### Opzioni Pattern

| Command | Description |
|---------|-------------|
| `-e pattern` | Specifica un pattern (uso multiplo) |
| `-f file` | Legge pattern da file (uno per riga) |
| `-E 'a\|b\|c'` | Alternanza ERE per pattern multipli |
| `-F` | Stringhe fisse — nessuna regex, corrispondenza più veloce |
| `-G` | Regex base (modalità predefinita) |
| `-P` | Regex compatibile Perl (PCRE) |

## Performance

### Consigli sulle Performance

| Command | Description |
|---------|-------------|
| `-F (fgrep)` | Modalità stringa fissa — più veloce per stringhe letterali |
| `LC_ALL=C grep` | Bypassa la localizzazione per un aumento 2-10x su dati ASCII |
| `--include/--exclude` | Riduci i file da cercare prima di aprirli |
| `-m N` | Ferma dopo N corrispondenze per file |
| `-q` | Modalità silenziosa — esce alla prima corrispondenza (per script) |
| `ripgrep (rg)` | Sostituto diretto; più veloce su grandi repository |

### Esempi di Performance

```
LC_ALL=C grep -F "exact string" huge.log
grep -r -m 1 "needle" /var/log/     # ferma dopo il primo risultato
grep -rq "pattern" . && echo "found" # test booleano
grep -r --include="*.go" "func main" .
```

## Pattern Comuni

### One-Liner

```
grep -rn "TODO\|FIXME\|HACK" src/      # trova marcatori codice
grep -oP '(?<=")[^"]+(?=")' f           # estrai stringhe tra virgolette
grep -E '^\s*$' f | wc -l              # conta righe vuote
grep -c '' *.py | sort -t: -k2 -rn     # ordina file per conteggio righe
grep -rn --include="*.yaml" "password" . # audit per segreti
```

### Ricette

| Command | Description |
|---------|-------------|
| `Indirizzi IP` | `grep -oE '[0-9]{1,3}(\.[0-9]{1,3}){3}'` |
| `Indirizzi email` | `grep -oE '[a-zA-Z0-9._%+-]+@[a-z.-]+'` |
| `URL` | `grep -oE 'https?://[^ ]+'` |
| `Righe tra marcatori` | `grep -A999 'START' f \| grep -B999 'END'` |
| `Corrispondenze univoche` | `grep -oE 'pattern' f \| sort -u` |
| `Conteggio per pattern` | `grep -c 'pat1' f; grep -c 'pat2' f` |
