Grep, o Global Regular Expression Print, è un comando Linux estremamente utile per trovare modelli corrispondenti. Può esaminare file e directory e leggere anche l'input dai comandi. Cerca con espressioni regolari o regolari e stampa le righe da un file che corrisponde al modello specificato.
In questo post, vedremo come utilizzare il comando Grep in Linux. I comandi discussi qui sono stati testati su Ubuntu 20.04. Gli stessi comandi Grep funzionano anche per Debian, Mint, Fedora e CentOS.
Installazione del comando grep
La maggior parte delle distribuzioni Linux, incluso Ubuntu 20.04 LTS, viene fornita con grep installato. Nel caso in cui sul tuo sistema non sia installato Grep, puoi installarlo utilizzando il comando seguente in Terminale:
$ Sudo apt-get install grep
Sintassi del comando Grep
La sintassi di base del comando Grep è la seguente:
$ grep [options] PATTERN [FILE...]
Utilizzo del comando Grep
Trovare una parola in un file
Con Grep puoi cercare qualsiasi parola in un file specifico. La sintassi sarebbe:
$ grep <word> <filename>
Ad esempio, il comando seguente cercherà la parola "Donuts" nel file "Donuts.txt".
$ grep Donuts Donuts.txt
Trovare una parola in più file
Puoi anche cercare una parola specifica in più file.
$ grep <word> <filename1> < filename2>
Ad esempio, il comando seguente cercherà la parola "Donuts" sia in "Donuts.txt" che in "cakes.txt".
$ grep Donuts Donuts.txt cakes.txt
Ignora maiuscole/minuscole
Grep esegue ricerche con distinzione tra maiuscole e minuscole per impostazione predefinita, ciò significa che tratta "ciambella" e "ciambelle" in modo diverso. Se eseguiamo nuovamente il comando precedente con "ciambelle", questa volta non vedrai alcun output.
$ grep donuts Donuts.txt
Per ignorare il caso, dovrai aggiungere "-i ” al tuo comando in questo modo:
$ grep –i <word> <filename>
Trovare un file per estensione in una directory
Puoi anche trovare un file in una directory specifica in base alla sua estensione. Utilizzare la seguente sintassi per farlo:
$ ls ~/<directory> | grep .<file type>
Ad esempio, per trovare tutti i file ".jpeg" nella cartella "Download", il comando sarebbe:
$ ls ~/Downloads | grep .jpeg
Righe di stampa che non corrispondono a un motivo
Con Grep, puoi anche stampare le linee che non corrispondono al tuo modello aggiungendo "-v ” al tuo comando. Utilizzare la seguente sintassi per farlo:
$ grep -v <word> <filename>
Ad esempio, il comando seguente stamperà tutte le righe tranne quella che contiene la parola "Donuts".
Stampa solo la parola corrispondente
Per impostazione predefinita, grep stampa l'intera riga che contiene il motivo. Per stampare solo la parola corrispondente, aggiungi "-o ” al tuo comando.
$ grep -o <word> <filename>
Ad esempio, il comando seguente stamperà solo la parola "Donuts" invece di stampare l'intera riga dal file "Donuts.txt".
Numero riga di stampa del modello e della riga corrispondenti
Per impostazione predefinita, grep stampa l'intera riga che contiene il motivo. Per stampare sia il numero di riga che la riga che contiene la parola corrispondente, aggiungi "-n ” al tuo comando.
$ grep -n <word> <filename>
Ad esempio, il comando seguente stamperà sia il numero di riga che la riga che contiene la parola "Donuts".
$ grep -n Donuts Donuts.txt
Stampa nomi di file che corrispondono a un modello
Per stampare tutti i file nella directory corrente che corrispondono al modello, utilizzare la seguente sintassi:
$ grep -l “<word>” *
Ad esempio, il seguente comando stamperà tutti i file che contengono la parola “Ciao”:
$ grep -l “Hello” *
Stampa l'intera parola corrispondente
Per impostazione predefinita, grep stampa tutte le parole che corrispondono al tuo modello, anche se fanno parte di una parola. Guarda l'immagine qui sotto.
Abbiamo cercato la stringa "fai ” e può vedere tutte le righe che contengono “do ”. Per abbinare la parola esatta, aggiungi "-w ” al tuo comando.
$ grep –w <word> <filename>
Ad esempio, per cercare la parola esatta "fai ” nel file Donuts.txt, il comando sarebbe:
$ grep -w do Donuts.txt
Come puoi vedere, ora stampa solo la riga che contiene la parola esatta "fai ”.
Righe corrispondenti che iniziano con una parola particolare
Per stampare righe che iniziano con una parola particolare, aggiungi "^ ” al tuo comando.
$ grep ^<word> <filename>
Ad esempio, il comando seguente stamperà tutte le righe che iniziano con "Th ”.
$ grep ^Th Donuts.txt
Linee corrispondenti che terminano con un motivo
Per stampare linee che terminano con un motivo particolare, aggiungi "$ ” al tuo comando.
$ grep <word>$ <filename>
Ad esempio, il comando seguente stamperà tutte le righe che terminano con "t ”.
$ grep t$ Donuts.txt
Righe corrispondenti che contengono determinate lettere
Se vuoi cercare le righe che contengono una o più lettere, usa la seguente sintassi:
$ grep “[<letters>]” <filename>
Ad esempio, il comando seguente stampa tutte le righe che contengono qualsiasi lettera da "a" a "f".
$ grep “[a-f]” Donuts.txt
Ricerca ricorsiva
Per cercare tutti i file in una directory e sottodirectory per un particolare modello o parola, utilizzare:
$ grep -R <word> <path>
Ad esempio, il comando seguente elencherà tutti i file che contengono la parola "Hello" nella directory Documents. Nell'output sottostante, puoi vedere i percorsi dei file insieme alle parole corrispondenti.
$ grep -R “Hello” /home/maryam/Documents
Stampa righe specifiche prima/dopo le parole abbinate
Per impostazione predefinita, Grep stampa solo la linea che corrisponde al modello specifico. Con -A opzione in Grep, puoi anche includere alcune righe prima o dopo le parole abbinate.
Righe di stampa dopo la partita
Per stampare le righe che contengono le parole abbinate tra cui N numero di righe dopo le partite:
$ grep -A <N> <word> <filename>
Ad esempio, il comando seguente stamperà la riga contenente la parola "inferno" insieme a 1 riga dopo di essa.
$ grep -A 1 hell Donuts.txt
Righe di stampa prima della partita
Per stampare le righe che contengono le parole abbinate tra cui N numero di righe prima delle partite:
$ grep -B <N> <word> <filename>
Ad esempio, il comando seguente stamperà la riga contenente la parola "inferno" insieme a 1 riga prima.
$ grep -B 1 hell Donuts.txt
Righe di stampa prima e dopo la partita
Per stampare le righe che contengono le parole abbinate tra cui N numero di righe prima e dopo le partite:
$ grep -C <N> <word> <filename>
Ad esempio, il comando seguente stamperà la riga contenente la parola "inferno" insieme a 1 riga prima e dopo di essa.
$ grep -C 1 hell Donuts.txt
Conteggio del numero di partite
Usando il -c opzione con grep, puoi contare le linee che corrispondono a uno schema specifico. Ricorda, corrisponderà solo al numero di righe e non al numero di parole abbinate.
$ grep -c <word> <filename>
Ad esempio, il comando seguente stampa il conteggio delle righe che contiene la parola “Donuts”.
$ grep -c Donuts Donuts.txt
Nota che il nostro file "Donuts.txt" contiene 4 "Donuts", ma -c ha stampato il conteggio solo come 3. Succede perché conta il numero di righe anziché il numero di corrispondenze.
Per ulteriori informazioni su grep, utilizzare il comando seguente:
$ grep --help
oppure visita la pagina man usando il comando seguente:
$ man grep
Questo ti porterà alla pagina del manuale di Grep.
Questo è tutto quello che c'è da fare! In questo post, abbiamo spiegato la sintassi di base e l'utilizzo del comando grep in Linux. Abbiamo anche esaminato alcune opzioni della riga di comando per espandere la sua utilità. Se conosci altri usi del comando Grep in Linux che ci sono sfuggiti, ci piacerebbe conoscerli nei commenti qui sotto.
Esplora questo articolo correlato per scoprire come trovare file e directory in Linux.