Linux Commands · 12 min read · Sep 12, 2025
Come usare grep per cercare stringhe nei file sulla shell Linux

Il comando GREP su Linux - una panoramica
Il comando grep in Linux è un potente strumento di ricerca di testo che consente agli utenti di cercare attraverso file o flussi di testo per modelli specifici. Sta per “global regular expression print“ e supporta la ricerca tramite semplici stringhe di testo e espressioni regolari più complesse. Il comando è spesso combinato con altri comandi per filtrare e affinare l’output. Per impostazione predefinita, grep restituisce tutte le righe che contengono il modello. Tuttavia, offre varie opzioni per personalizzare la ricerca, come la sensibilità al maiuscolo/minuscolo, il conteggio delle occorrenze o la ricerca ricorsiva attraverso le directory. Questo lo rende uno strumento essenziale per amministratori di sistema, sviluppatori e chiunque lavori con grandi set di dati in un ambiente simile a Unix.
Il comando grep è principalmente utilizzato per cercare un testo o un file per righe che contengono una corrispondenza con le parole/stringhe specificate. Per impostazione predefinita, grep visualizza le righe corrispondenti e può essere utilizzato per cercare righe di testo che corrispondono a una o più espressioni regolari, e restituisce solo le righe corrispondenti.
Requisiti
Il comando grep fa parte delle utilità di base di qualsiasi distribuzione Linux, quindi è preinstallato per impostazione predefinita su AlmaLinux, CentOS, Debian, Linux Mint, Ubuntu, RHEL e RockyLinux.
La sintassi di base del comando grep
La sintassi di base del comando grep è la seguente:
grep 'word' filename
grep 'word' file1 file2 file3
grep 'string1 string2' filename
cat otherfile | grep 'something'
command | grep 'something'
command option1 | grep 'data'
grep --color 'data' fileNameCome usare il comando grep per cercare in un file
Nel primo esempio, cercherò l’utente “tom” nel file passwd di Linux. Per cercare nel file /etc/passwd l’utente “tom”, è necessario inserire il seguente comando:
grep tom /etc/passwdDi seguito è riportato l’output di esempio:
tom:x:1000:1000:tom,,,:/home/tom:/bin/bashHai la possibilità di istruire grep a ignorare il maiuscolo/minuscolo, cioè, corrispondere a abc, Abc, ABC e tutte le possibili combinazioni con l’opzione -i come mostrato di seguito:
grep -i "tom" /etc/passwdUso ricorsivo di grep
Se hai un insieme di file di testo in una gerarchia di directory, ad esempio, i file di configurazione di Apache in /etc/apache2/ e vuoi trovare il file in cui è definito un testo specifico, utilizza l’opzione -r del comando grep per eseguire una ricerca ricorsiva. Questo eseguirà un’operazione di ricerca ricorsiva attraverso i file per la stringa “197.167.2.9” (come mostrato di seguito) nella directory /etc/apache2/ e tutte le sue sottodirectory:
grep -r "mydomain.com" /etc/apache2/In alternativa, può essere utilizzato il seguente comando:
grep -R "mydomain.com" /etc/apache2/Di seguito sono riportati gli output di esempio per una ricerca simile su un server Nginx:
grep -r "mydomain.com" /etc/nginx/
/etc/nginx/sites-available/mydomain.com.vhost: if ($http_host != "www.mydomain.com") {Qui, vedresti il risultato per mydomain.com su una riga distinta preceduta dal nome del file (ad esempio /etc/nginx/sites-available/mydomain.com.vhost) in cui è stato trovato. L’inclusione dei nomi dei file nei dati di output può essere facilmente soppressa utilizzando l’opzione -h (come spiegato di seguito): grep -h -R “mydomain.com” /etc/nginx/. Di seguito è riportato l’output di esempio:
grep -r "mydomain.com" /etc/nginx/
if ($http_host != "www.mydomain.com") {Utilizzare grep per cercare solo parole
Quando cerchi abc, grep corrisponderà a tutti i tipi di cose, ad esempio, kbcabc, abc123, aarfbc35 e molte altre combinazioni senza rispettare i confini delle parole. Puoi costringere il comando grep a selezionare solo quelle righe che contengono corrispondenze per formare parole intere (quelle che corrispondono solo alla parola abc), come mostrato di seguito:
grep -w "abc" file.txtEsempio:

Utilizzare grep per cercare due parole diverse
Per cercare due parole diverse, devi utilizzare il comando egrep come mostrato di seguito:
egrep -w 'word1|word2' /path/to/fileContare le righe per parole corrispondenti
Il comando grep ha la capacità di riportare il numero di volte in cui un particolare modello è stato corrisposto per ciascun file utilizzando l’opzione -c (conteggio) (come mostrato di seguito):
grep -c 'word' /path/to/fileInoltre, gli utenti possono utilizzare l’opzione ‘-n’ precedendo ogni riga di output con il numero della riga nel file di testo da cui è stata ottenuta (come mostrato di seguito):
grep -n 'root' /etc/passwdDi seguito sono riportati gli output di esempio:
1:root:x:0:0:root:/root:/bin/bash
Corrispondenza inversa di grep
Gli utenti possono utilizzare l’opzione -v per stampare le corrispondenze inverse, il che significa che corrisponderà solo a quelle righe che non contengono la parola data. Ad esempio, stampa tutte le righe che non contengono la parola par utilizzando il seguente comando:
grep -v par /path/to/fileCome elencare solo i nomi dei file corrispondenti
Devi utilizzare l’opzione -l per elencare i nomi dei file i cui contenuti menzionano una particolare parola, ad esempio, la parola ‘primary’, utilizzando il seguente comando:
grep -l 'primary' *.cInfine, hai la possibilità di costringere grep a visualizzare l’output in colori specifici utilizzando il seguente comando:
grep --color root /etc/passwdDi seguito sono riportati gli output di esempio:
Come fare in modo che il comando grep gestisca più modelli di ricerca
Potrebbero esserci situazioni in cui potresti voler cercare più modelli in un file dato (o set di file). In tali scenari, dovresti utilizzare l’opzione della riga di comando ‘-e‘ che grep fornisce.
Ad esempio, supponiamo che tu voglia cercare le parole “how”, “to” e “forge” in tutti i file di testo presenti nella tua directory di lavoro corrente, ecco come puoi farlo:
grep -e how -e to -e forge *.txtEcco il comando in azione:
L’opzione della riga di comando ‘-e‘ aiuta anche in scenari in cui il modello inizia con un trattino (-). Ad esempio, se vuoi cercare, diciamo, “-how”, il seguente comando non sarà utile:
grep -how *.txtÈ quando usi l’opzione della riga di comando -e che il comando capisce esattamente cosa stai cercando in questo caso:
grep -e -how *.txtEcco entrambi i comandi in azione:
Come limitare l’output di grep a un numero particolare di righe
Nel caso in cui tu voglia limitare l’output di grep a un numero particolare di righe, puoi farlo utilizzando l’opzione della riga di comando ‘-m‘. Ad esempio, supponiamo che tu voglia cercare la parola “how” in testfile1.txt che contiene le seguenti righe:
Ma il requisito è che grep smetta di cercare dopo che sono state trovate 3 righe contenenti il modello cercato. Quindi, per fare questo, puoi eseguire il seguente comando:
grep "how" -m3 testfile1.txtEcco il comando in azione:
Procedendo, ecco cosa dice la pagina man del comando:
Se l'input è l'input standard da un file regolare e NUM righe corrispondenti vengono restituite, grep assicura che l'input standard sia posizionato appena dopo l'ultima riga corrispondente prima di uscire, indipendentemente dalla presenza di righe di contesto finali. Questo consente a un processo chiamante di riprendere una ricerca.Quindi, ad esempio, se hai uno script bash che ha un ciclo e vuoi ottenere una corrispondenza per ogni iterazione del ciclo, allora usare ‘grep -m1’ farà il necessario.
Come fare in modo che grep ottenga modelli da un file
Se vuoi, puoi anche fare in modo che il comando grep ottenga modelli da un file. L’opzione della riga di comando -f dello strumento ti consente di farlo.
Ad esempio, supponiamo che tu voglia cercare tutti i file .txt nella directory corrente per le parole “how” e “to”, ma vuoi fornire queste stringhe di input tramite un file chiamato, diciamo, “input”, ecco come puoi farlo:
grep -f input *.txtEcco il comando in azione:
Come fare in modo che grep visualizzi solo quelle righe che corrispondono completamente al modello di ricerca
Fino ad ora, abbiamo visto che per impostazione predefinita grep corrisponde e visualizza righe complete che contengono modelli di ricerca. Ma se il requisito è fare in modo che grep visualizzi solo quelle righe che corrispondono completamente al modello cercato, questo può essere fatto utilizzando l’opzione della riga di comando ‘-x’.
Ad esempio, supponiamo che il file testfile1.txt contenga le seguenti righe:
E il modello che vuoi cercare è “how are you?”. Quindi, per assicurarti che grep visualizzi solo righe che corrispondono completamente a questo modello, usalo nel seguente modo:
grep -x "how are you?" *.txtEcco il comando in azione:
Come forzare grep a non visualizzare nulla nell’output
Potrebbero esserci situazioni in cui non hai bisogno che il comando grep produca nulla nell’output. Invece, vuoi solo sapere se è stata trovata una corrispondenza in base allo stato di uscita del comando. Questo può essere ottenuto utilizzando l’opzione della riga di comando -q.
Mentre l’opzione -q silenzia l’output, lo stato di uscita dello strumento può essere confermato dal comando ‘echo $?’. Nel caso di grep, il comando esce con stato ‘0’ quando ha successo (significa che è stata trovata una corrispondenza), mentre esce con stato ‘1’ quando non è stata trovata alcuna corrispondenza.
Lo screenshot seguente mostra sia gli scenari di successo che quelli non riusciti:

Come fare in modo che grep visualizzi i nomi dei file che non contengono il modello di ricerca
Per impostazione predefinita, il comando grep visualizza il nome dei file contenenti il modello di ricerca (così come le righe corrispondenti). Questo è abbastanza logico, poiché è ciò che ci si aspetta da questo strumento. Tuttavia, potrebbero esserci casi in cui il requisito potrebbe essere quello di ottenere i nomi di quei file che non contengono il modello cercato.
Questo è possibile anche con grep - l’opzione -L ti consente di farlo. Quindi, ad esempio, per trovare tutti quei file di testo nella directory corrente che non contengono la parola “how”, puoi eseguire il seguente comando:
grep -L "how" *.txtEcco il comando in azione:
Come sopprimere i messaggi di errore prodotti da grep
Puoi costringere grep a silenziare eventuali messaggi di errore che visualizza nell’output se lo desideri. Questo può essere fatto utilizzando l’opzione della riga di comando -s. Ad esempio, considera il seguente scenario in cui grep produce errori/avvisi relativi alla directory che incontra:
Quindi in questo tipo di scenario, l’opzione della riga di comando -s aiuta. Vedi sotto.
Quindi puoi vedere che l’errore/l’avviso è stato silenziato.
Come fare in modo che grep cerchi ricorsivamente nelle directory
Come chiaro dall’esempio utilizzato nel punto precedente, il comando grep non esegue una ricerca ricorsiva per impostazione predefinita. Per assicurarti che la tua ricerca grep sia ricorsiva, utilizza l’opzione della riga di comando -d e passa il valore ‘recurse’ ad essa.
grep -d recurse "how" *Nota 1 : Il messaggio di errore/avviso relativo alla directory di cui abbiamo discusso nel punto precedente può essere silenziato anche utilizzando l’opzione -d - tutto ciò che devi fare è passare il valore ‘skip’ ad essa.
Nota 2 : Usa l’opzione ‘–exclude-dir=[DIR]’ per escludere le directory che corrispondono al modello DIR dalle ricerche ricorsive.
Come fare in modo che grep termini i nomi dei file con carattere NULL
Come abbiamo già discusso, l’opzione della riga di comando -l di grep viene utilizzata quando vuoi solo che lo strumento visualizzi i nomi dei file nell’output. Ad esempio:
Ora, dovresti sapere che ogni nome nell’output sopra è separato/terminato da un carattere di nuova riga. Ecco come puoi verificarlo:
Reindirizza l’output a un file e poi stampa il contenuto del file:
Quindi, l’output del comando cat conferma la presenza di un carattere di nuova riga tra i nomi dei file.
Ma come già saprai, il carattere di nuova riga può anche far parte di un nome di file. Quindi, quando si tratta di casi in cui i nomi dei file contengono una nuova riga e sono separati/terminati da una nuova riga, diventa difficile lavorare sull’output di grep (soprattutto quando si accede all’output tramite uno script).
Sarebbe utile se il carattere di separazione/terminazione non fosse una nuova riga. Bene, sarai felice di sapere che grep fornisce un’opzione della riga di comando -Z che garantisce che i nomi dei file siano seguiti da un carattere NULL e non da una nuova riga.
Quindi, nel nostro caso, il comando diventa:
grep -lZ "how" *.txtEcco come abbiamo confermato la presenza del carattere NULL:
Di seguito è riportata un’opzione della riga di comando correlata che dovresti conoscere:
-z, --null-data
Tratta l'input come un insieme di righe, ciascuna terminata da un byte zero (il carattere ASCII NUL) invece di una nuova riga. Come l'opzione -Z o --null, questa opzione può essere utilizzata con comandi come sort -z per elaborare nomi di file arbitrari.Come usare GREP per trovare errori nei file di log
Grep è il coltellino svizzero dell’amministratore Linux quando si tratta di debug degli errori nei servizi. La maggior parte dei servizi Linux ha file di log in cui segnalano errori. Questi file di log possono essere enormi e grep è un comando versatile e veloce per cercare, ad esempio, l’indirizzo IP di un sistema connesso, una stringa di errore o l’indirizzo email di un utente di posta interessato nel mail.log.
Esempi:
Cerca connessioni relative a un indirizzo email specifico. Qui, ‘[email protected]’ è nel file mail.log del server.
grep [email protected] /var/log/mail.logRisultato:
Aug 22 09:45:10 mail dovecot: pop3-login: Login: user=<[email protected]>, method=PLAIN, rip=192.168.0.112, lip=78.46.229.46, mpid=17596, TLS, session=<3uoa5ffQovld3Uep>
Aug 22 09:45:10 mail dovecot: pop3([email protected])<17596><3uoa5ffQovld3Uep>: Disconnected: Logged out top=0/0, retr=1/6647, del=1/1, size=6630
Aug 22 09:45:10 mail dovecot: pop3-login: Login: user=<[email protected]>, method=PLAIN, rip=192.168.0.112, lip=78.46.229.46, mpid=17673, TLS, session=
Aug 22 09:45:10 mail dovecot: pop3([email protected])<17673>: Disconnected: Logged out top=0/0, retr=0/0, del=0/0, size=0
Aug 22 09:45:10 mail dovecot: pop3-login: Login: user=<[email protected]>, method=PLAIN, rip=192.168.0.112, lip=78.46.229.46, mpid=17868, TLS, session=
Aug 22 09:45:10 mail dovecot: pop3([email protected])<17868>: Disconnected: Logged out top=0/0, retr=0/0, del=0/0, size=0
Aug 22 09:45:10 mail dovecot: pop3-login: Login: user=<[email protected]>, method=PLAIN, rip=192.168.0.112, lip=78.46.229.46, mpid=17964, TLS, session=
Aug 22 09:45:10 mail dovecot: pop3([email protected])<17964>: Disconnected: Logged out top=0/0, retr=0/0, del=0/0, size=0
Aug 22 09:45:10 mail postfix/smtpd[6932]: NOQUEUE: reject: RCPT from unknown[1.2.3.4]: 504 5.5.2 <1.2.3.4>: Helo command rejected: need fully-qualified hostname; from=<[email protected]> to=<[email protected]> proto=ESMTP helo=<1.2.3.4> Per monitorare continuamente un file di log per connessioni per questo indirizzo email, combina i comandi tail e grep in questo modo:
tail -f /var/log/mail.log | grep [email protected]Per uscire dalla funzione di monitoraggio, premi i tasti [strg] + c.
Altri esempi di comando GREP
Puoi trovare ancora più esempi di utilizzo di questo comando Linux nel nostro secondo tutorial sul comando GREP.
- Come eseguire la ricerca di modelli nei file utilizzando Grep
Ricevi i nuovi post nella tua casella di posta.
Nessuno spam. Disiscriviti in qualsiasi momento.