Skip to main content
  1. Comandi/

grep - cerca pattern nel testo (Global Regular Expression Print)

·5 mins
Alessio Barnini
Author
Alessio Barnini
Table of Contents

Cosa fa
#

Cerca pattern (stringhe o espressioni regolari) all'interno di file o flussi di dati (Standard Input). È il pilastro fondamentale per l'analisi dei log e l'isolamento di eventi sospetti.

Sintassi
#

grep [opzioni] "pattern" file

Comandi essenziali
#

ComandoFlagCosa fa
grep "Failed" auth.logCerca righe con la parola esatta "Failed".
grep -i "error" syslog-i (ignore-case)Cerca "error" ignorando maiuscole/minuscole.
grep -v "INFO" syslog-v (invert-match)Esclude le righe che contengono "INFO" (filtro negativo).
grep -r "password" /etc/-r (recursive)Ricerca globale in directory e sottocartelle.
grep -c "Failed" auth.log-c (count)Conta le occorrenze totali del pattern.
grep -n "error" syslog-n (line-number)Mostra il numero di riga del match.
grep -A 5 "ssh" file-A (after)Mostra il match + le 5 righe successive (utile per contesto).
grep -E "regex" file-E (extended)Abilita le espressioni regolari estese (ERE).
grep -o 'pattern' file-oonly-matching — solo il matchStampa solo la parte della riga che corrisponde al pattern, non tutta la riga
grep -C 5 "ssh" file-CMostra il match + le 5 righe precedenti (utile per contesto).

🧩 Potenziamento con Regex (Bandit 09 Style)
#

Quando usi grep -E, puoi usare simboli speciali per descrivere come deve essere fatta la riga, non solo cosa deve contenere.

I "Mattoncini" usati nel Livello 09:
#

SimboloSignificato
.Jolly: Rappresenta un carattere qualsiasi.
*Quantificatore: Il carattere precedente può ripetersi 0 o infinite volte.
^Ancora di Inizio: La riga deve iniziare esattamente da qui.
$Ancora di Fine: La riga deve finire esattamente qui.
\wWord: Corrisponde a lettere, numeri e underscore.
Pattern: ^.*==.*$

  ^          .* ==            .* $
  |          |              |             |           |
Inizio -- Qualsiasi -- Due uguali -- Qualsiasi -- Fine riga
riga      carattere    fissi         carattere

Le tue varianti per Bandit 09:
#

  1. grep -E "\w*==\w*"

    • Logica: Cerca "parole" attaccate a due uguali.
    • Rischio: Se la password ha uno spazio o un punto, la Regex si rompe.
  2. grep -E ".*=.*=.*"

    • Logica: Almeno due simboli uguale in qualsiasi posizione.
    • Rischio: Potrebbe catturare troppo rumore binario.
  3. grep -E "^.*==.*$"

    - _Logica:_ La riga "universale" che contiene almeno `==`.
  • Vantaggio: È la più robusta per catturare stringhe sporche.

🧠 Analisi da Senior Analyst
#

Come vedi, la differenza fondamentale sta nel posizionamento del cuscinetto .*:

  • Se metti .* prima dell'ancora di inizio (^.*), stai dicendo a grep: "Non mi interessa quanta spazzatura c'è prima di trovare il mio obiettivo".
  • Se lo togli (^==), stai dicendo: "Sii selettivo, l'obiettivo deve essere la primissima cosa che incontri".

LOGICA DELLE ANCORE E DEI CUSCINETTI (REGEX)
#


1. CONTIENE "==" (In qualsiasi punto)
   Pattern:  ^  .  * =  =  .  * $
             |  |__|  |__|  |__|  |
             |   |     |     |    +-- Fine della riga
             |   |     |     +------- Cuscinetto Post: Qualsiasi carattere (0+)
             |   |     +------------- CARATTERI FISSI: Cerca esattamente "=="
             |   +------------------- Cuscinetto Pre: Qualsiasi carattere (0+)
             +----------------------- Inizio della riga

   Match:    [ abc==123 ] , [ 5==========PASS ] , [ ==password ]


--------------------------------------------------------------------------------

2. INIZIA CON "==" (Rigido all'inizio)
   Pattern:  ^  =  =  .  * $
             |  |__|  |__|  |
             |   |     |    +-- Fine della riga
             |   |     +------- Cuscinetto: Tutto ciò che segue i primi "=="
             |   +------------- CARATTERI FISSI: La riga DEVE aprirsi con "=="
             +----------------- Inizio della riga

   Match:    [ ==abc123 ] , [ ==password ]
   No Match: [ abc==123 ] (Inizia con 'a')


--------------------------------------------------------------------------------

3. FINISCE CON "==" (Rigido alla fine)
   Pattern:  ^  .  * =  =  $
             |  |__|  |__|  |
             |   |     |    +-- Fine della riga: La riga DEVE chiudersi con "=="
             |   |     +------- CARATTERI FISSI
             |   +------------- Cuscinetto: Tutto ciò che precede gli ultimi "=="
             +----------------- Inizio della riga

   Match:    [ abc123== ] , [ password== ]
   No Match: [ abc==123 ] (Finisce con '3')

================================================================================

Esempi pratici di navigazione
#

Uno dei tuoi trucchi più utili per studiare i manuali:

# Estrae la sezione esempi dal manuale di find (circa 20 righe)
man find | grep -A 20 -i "^examples" 

Combinazioni utili (SOC Analysis)
#

# Analisi forense: Classifica gli IP che hanno fallito il login (dal più frequente)
cat /var/log/auth.log | grep "Failed" | awk '{print $11}' | sort | uniq -c | sort -rn

# Monitoraggio Real-time: Filtra log cercando errori o negazioni
journalctl -f | grep -i "error\|failed\|denied"

# Hardening: Identifica quali servizi sono abilitati all'avvio
sudo systemctl list-unit-files | grep "enabled"

Estrae tutti i src di file JS da una pagina HTML
#

grep -o 'src="[^"]*\.js"' index.html 
# -o = stampa solo il match, non tutta la riga 
# [^"]* = qualsiasi carattere tranne virgolette (zero o piu') 
# \.js = letteralmente ".js" (il . e' escaped) 
# Utile per: analisi di pagine web, trovare risorse caricate

Scenario Reale
#

Durante l'analisi di un possibile attacco Brute Force, un analista utilizza la combinazione grep | uniq -c per identificare se un singolo indirizzo IP ha generato migliaia di tentativi di accesso in pochi minuti, permettendo di bloccare l'attaccante sul firewall.

Dove l'ho usato
#

  • bandit-07 — Per trovare la stringa "millionth" in un file di dati immenso.
  • bandit-10 — Per estrarre dati leggibili da output complessi.
  • progetto-lab-vm — Per navigare nel manuale di SSH e controllare lo stato dei demoni.

Note personali
#

Analyst Tip: La combo grep | sort | uniq -c | sort -rn è il pane quotidiano del SOC. Trasforma migliaia di righe di log disordinate in una classifica statistica chiara. Ricorda di usare sempre le virgolette " " per racchiudere il pattern.

Collegato a
#

  • log — categoria (Hub)
  • system — categoria (Hub)
  • regex — concetto (pattern complessi)
  • awk — spesso usato in pipeline dopo grep per isolare colonne specifiche

Related