Grep è un semplice e diffuso metodo, molto utile per cercare e filtrare spe­ci­fi­che stringhe di caratteri nei file su Linux. Il comando Linux si basa su una sintassi unitaria e facilita la ricerca tramite parametri pre­sta­bi­li­ti.

Che cos’è grep?

grep è l’acronimo di “global regular ex­pres­sion print”. Poiché il programma è integrato nel pacchetto di base di Ubuntu, non è ne­ces­sa­rio in­stal­lar­lo. I comandi grep sono usati per cercare modelli e stringhe di caratteri. Si possono in tal modo filtrare ed evi­den­zia­re le in­for­ma­zio­ni cercate anche in file di log di grandi di­men­sio­ni. È im­por­tan­te ricordare che non si deve mai eseguire il comando grep per file relativi ai di­spo­si­ti­vi, poiché ciò può provocare dei problemi.

In che modo è usato grep?

La sintassi di base di grep si presenta così: “grep [opzioni] stringa di ricerca [file]” oppure, in al­ter­na­ti­va, “grep [opzioni] [-e modello | -f file] [file]”. Un semplice esempio di un comando grep in Linux potrebbe essere la ricerca di un termine nel testo di un codice o di un file di log. Se volete quindi cercare la parola “test” in un file di testo chiamato esempio.txt, im­met­te­re­te il seguente comando grep: “grep "test" esempio.txt”. Vedrete quindi vi­sua­liz­za­te le righe cor­ri­spon­den­ti a tale criterio contenute in questo file.

Le espres­sio­ni regolari come base per grep

Le basi di questo processo in Linux sono le co­sid­det­te “espres­sio­ni regolari”, che si dif­fe­ren­zia­no nelle varianti “basic” ed “extended”, in cui la seconda è molto im­por­tan­te per il comando grep. Tramite le espres­sio­ni regolari possono essere cercate con grep dei singoli caratteri o stringhe di caratteri. Sia che si tratti di un carattere che di una lettera o di un numero, può essere trovato con una semplice im­mis­sio­ne, anche se fa parte di una stringa di caratteri. Ad esempio, im­met­ten­do il numero “2” tramite il comando si tro­ve­reb­be non solo il numero “2”, ma anche sequenze, come “1234”, “y2k” o “numero 2”.

Esistono dei caratteri in grep che svolgono una funzione nel processo di ricerca. Il carattere del dollaro “$”, ad esempio, trova la fine di una riga. Tali caratteri possono essere cercati se­pa­ra­ta­men­te tramite un comando specifico in grep. A questo scopo, il carattere è preceduto da una barra ro­ve­scia­ta. Se cercate, ad esempio, un punto “.” come segno d’in­ter­pun­zio­ne in un file, dovrete usare la com­bi­na­zio­ne “\.”.

Liste in grep

Con grep possono essere anche filtrate le liste di diversi caratteri, cioè le co­sid­det­te “bracket ex­pres­sions” (in italiano: espres­sio­ni tra parentesi). Per le liste di caratteri che devono essere cercate tramite l’ope­ra­zio­ne di ricerca, userete due parentesi quadre “[]”. Se, ad esempio, de­si­de­ra­te cercare tutte le lettere “e” maiuscole o minuscole, userete l’opzione di ricerca: “[Ee]”. Questa istru­zio­ne di ricerca trova quindi tutte le lettere “e”. Com­bi­nan­do­le, invece, potete anche filtrare parole intere o frammenti di testo tramite una “e” maiuscola o minuscola. Inserite in grep, ad esempio, “[Ee]sodo”, grep trova non solo “Esodo” ma anche parti di testo con le “e” minuscole in una parola come “lesto”.

Un’altra utile funzione di grep è la pos­si­bi­li­tà di escludere nel processo di ricerca spe­ci­fi­che cifre da una lista e di cercare soltanto quelle che non sono comprese in tale esclu­sio­ne. Per attivarla si antepone “^”. Con “^Ee” saranno ricercati, ad esempio, tutti i caratteri eccetto “E” ed “e”.

Con l’ausilio di liste pre­de­fi­ni­te, il comando grep in Linux vi permette di ri­spar­miar­vi del lavoro. Ciascuna di queste liste pre­de­fi­ni­te è compresa inoltre in parentesi quadre, vale a dire [[:li­stae­sem­pio:]]. Le liste pre­de­fi­ni­te sono:

  • [:alnum:]: contiene tutte le cifre [:digit:] e lettere [:alpha:]
  • [:alpha:]: contiene tutte le lettere [:upper:] e [:lower:]
  • [:blank:]: contiene tutti gli spazi liberi creati dalla barra spa­zia­tri­ce o dal ta­bu­la­to­re
  • [:cntrl:]: contiene tutti i caratteri di controllo
  • [:digit:]: contiene tutti i numeri da 0 a 9
  • [:graph:]: contiene tutti i caratteri grafici [:alnum:] e [:punct:]
  • [:lower:]: contiene tutte le lettere minuscole
  • [:print:]: contiene tutti i caratteri stam­pa­bi­li [:alnum:], [:punct:] e [:space:]
  • [:punct:]: contiene tutti i caratteri speciali e i segni di in­ter­pun­zio­ne
  • [:space:]: contiene tutti i caratteri che de­ter­mi­na­no uno spazio vuoto, come un ritorno a capo o gli spazi liberi
  • [:upper:]: contiene tutte le lettere maiuscole

Esempi di comandi grep molto utili

Se usati cor­ret­ta­men­te, i comandi grep vi aiutano a compiere delle ricerche nei file di grandi di­men­sio­ni. Diversi sono i parametri im­pie­ga­bi­li affinché possiate definire con esattezza la ricerca, in modo che grep iden­ti­fi­chi esclu­si­va­men­te quei caratteri o quelle righe che volete trovare. Questi saranno con­tras­se­gna­ti con il segno “-“. Di seguito alcuni esempi molto utili:

  • -c: con -c oppure -count, il comando grep non cerca in base al modello dei criteri di ricerca, ma indica in quante righe tale schema di ricerca è stato trovato. Il comando grep “grep -c "test" esempio.txt” conta pertanto in quante righe “test” è presente e vi indica il numero.
  • -l: se volete sapere in quale file è stato trovato uno specifico termine di ricerca, usate l’opzione “-l” (“L” minuscola, da non con­fon­de­re con la “I” maiuscola). Con il comando grep “grep -l "test" \*.txt” ef­fet­tua­te la ricerca di tutti i file che con­ten­go­no il termine o la stringa di caratteri “test”.
  • -i: con -i le maiuscole e le minuscole delle parole saranno ignorate nella vostra ricerca. Quindi, “grep -i "test" esempio.txt” mostra tutte le righe che con­ten­go­no sia “test” che “Test”.

Esistono altre tre varianti di grep

Oltre alla versione standard di grep, esistono altre tre varianti. egrep cor­ri­spon­de in modo ampio a grep -E e considera il modello indicato come un’esten­sio­ne delle espres­sio­ni regolari. fgrep cor­ri­spon­de in buona parte a grep -F e cerca in modo par­ti­co­la­re in base a parametri di de­ter­mi­na­ti modelli. I caratteri che in altri comandi saranno letti come parte di un’espres­sio­ne regolare, saranno in­ter­pre­ta­ti da fgrep nel suo si­gni­fi­ca­to letterale senza la funzione ag­giun­ti­va. Alcuni esempi al riguardo sono “$”, “*” oppure “\”. rgrep cor­ri­spon­de a grep -r e cerca tutte le directory in modo ricorsivo, considera quindi anche le directory su­bor­di­na­te.

Vai al menu prin­ci­pa­le