Il comando grep di Linux viene utilizzato come metodo per filtrare l'input. GREP è l'acronimo di Global Regular Expression Printer e quindi, per poterlo utilizzare in modo efficace, è necessario avere una certa conoscenza delle espressioni regolari.
In questo articolo, imparerai una serie di esempi che ti aiuteranno a capire il comando grep.
01 del 09Come cercare una stringa in un file utilizzando GREP

Immagina di avere un file di testo chiamato libri con i seguenti titoli di libri per bambini:
- Robin Hood
- Cappuccetto Rosso
- Peter Pan
- Riccioli d'oro e tre orsi
- Biancaneve e i sette nani
- Pinocchio
- Il gatto nel cappello
- I tre porcellini
- Il Gruffalo
- Charlie e la fabbrica di cioccolato
Per trovare tutti i libri con la parola "The" nel titolo si usa la seguente sintassi:
grep I libriVerranno restituiti i seguenti risultati:
- Riccioli d'oro e tre orsi
- Biancaneve e i sette nani
- Il gatto nel cappello
- I tre porcellini
- Il Gruffalo
- Charlie e la fabbrica di cioccolato
In ogni caso, la parola "The" sarà evidenziata.
La ricerca è sensibile al maiuscolo e minuscolo, quindi se uno dei titoli avesse "il" anziché "Il", non sarebbe stato restituito.
Per ignorare il caso è possibile aggiungere il seguente interruttore:
grep the books --ignore-casePuoi anche utilizzare l'opzione -i come segue:
Continua a leggere sotto
02 del 09Cerca una stringa in un file usando i caratteri jolly
Il comando grep è molto potente. È possibile utilizzare una moltitudine di tecniche di corrispondenza dei modelli per filtrare i risultati.
In questo esempio, ti mostrerò come cercare una stringa in un file usando i caratteri jolly.
Immagina di avere un file chiamato luoghi con i seguenti nomi di località scozzesi:
AberdeenAberystwythAberlourInverurieInvernessnewburghnuovo cervonuovo gallowayGlasgowEdimburgoSe vuoi trovare tutti i posti con inver nel nome usa la seguente sintassi:
grep inver * placesIl carattere jolly asterisco (*) sta per 0 o molti. Quindi se si ha un posto chiamato inver o un posto chiamato Inverness allora entrambi sarebbero restituiti.
Un altro carattere jolly che puoi usare è il punto (.). Puoi usarlo per abbinare una singola lettera.
grep inver.r placesIl comando precedente troverebbe i posti chiamati inverurie e inverary ma non troverebbero invereerie perché ci può essere solo un jolly tra i due r come indicato dal singolo periodo.
Il carattere jolly di periodo è utile ma può causare problemi se ne hai uno come parte del testo che stai cercando.
Per esempio guarda questo elenco di nomi di dominio
- linux.about.com
- pcsupport.about.com
- mp3.about.com
- minecraft.about.com
- androidgames.about.com
- netforbeginners.about.com
- everydaylinuxuser.com
- google.co.uk
- google.au
- direct.gov.uk
Per trovare tutti i circa .com puoi cercare usando la seguente sintassi:
grep * about * domainnamesIl comando sopra potrebbe cadere se la lista contenesse il seguente nome in esso:
- everydaylinuxuser.com/about.html
Potresti, quindi, provare la seguente sintassi:
grep * about.com domainnamesFunzionerebbe bene a meno che non ci fosse un dominio con il seguente nome:
aboutycom.comPer cercare realmente il termine about.com, è necessario uscire dal punto come segue:
grep * about .com domainnamesIl carattere jolly finale da mostrare è il punto interrogativo che rappresenta zero o un carattere.
Per esempio:
nomi in filaIl comando precedente restituirebbe aberdeen, aberystwyth o anche berwick.
Continua a leggere sotto
03 di 09Cerca le stringhe all'inizio e alla fine della riga utilizzando grep
Il simbolo carato (^) e dollaro ($) ti consentono di cercare i motivi all'inizio e alla fine delle righe.
Immagina di avere un file chiamato calcio con i seguenti nomi di squadra:
- Blackpool
- Liverpool
- Manchester City
- Leicester City
- Manchester United
- Newcastle United
- FC United Of Manchester
Se si desidera trovare tutte le squadre che sono iniziate con Manchester, si utilizza la seguente sintassi:
grep ^ Squadre di ManchesterIl comando di cui sopra restituirebbe Manchester City e Manchester United ma non l'FC United Of Manchester.
In alternativa, puoi trovare tutte le squadre che terminano con United usando la seguente sintassi:
grep United $ teamsIl comando sopra riportato tornerebbe al Manchester United e al Newcastle United ma non all'FC United Of Manchester.
04 di 09Conteggio del numero di corrispondenze usando grep
Se non vuoi restituire le linee reali che corrispondono a un pattern usando grep ma vuoi solo sapere quanti ce ne sono, puoi usare la seguente sintassi:
grep -c file di input del modelloSe il modello è stato abbinato due volte, verrà restituito il numero 2.
Continua a leggere sotto
05 di 09Trovare tutti i termini che non corrispondono usando grep
Immagina di avere un elenco di nomi di luoghi con i Paesi elencati come segue:
- aberdeen Scozia
- Glasgow glasgow
- Liverpool Inghilterra
- colwyn bay
- Londra, Inghilterra
Potresti aver notato che colwyn bay non ha alcun paese associato.
Per cercare tutti i luoghi con un paese è possibile utilizzare la seguente sintassi:
grep land $ placesI risultati restituiti sarebbero tutti i posti tranne che per la baia di Colwyn.
Questo ovviamente funziona solo per i luoghi che finiscono in terra (difficilmente scientifico).
È possibile invertire la selezione usando la seguente sintassi:
grep -v land $ placesQuesto avrebbe trovato tutti i posti che non finivano con la terra.
06 di 09Come trovare linee vuote nei file usando grep
Immagina di avere un file di input che viene utilizzato da un'applicazione di terze parti che interrompe la lettura del file quando trova una riga vuota come segue:
- aberdeen scozia
- Inverness Scozia
- liverpool inghilterra
- colwyn bay wales
Quando l'applicazione raggiunge la linea dopo liverpool, smetterà di leggere il significato che manca a colwyn bay.
Puoi utilizzare grep per cercare righe vuote con la seguente sintassi:
grep ^ $ placesSfortunatamente questo non è particolarmente utile perché restituisce solo le righe vuote.
Ovviamente potresti ottenere un conteggio del numero di righe vuote come controllo per vedere se il file è valido come segue:
grep -c ^ $ postiSarebbe comunque più utile conoscere i numeri di riga che hanno una riga vuota in modo che sia possibile sostituirli. Puoi farlo con il seguente comando:
grep -n ^ $ postiContinua a leggere sotto
07 di 09Come cercare stringhe di caratteri maiuscoli o minuscoli che utilizzano grep
Usando grep puoi determinare quali linee in un file hanno caratteri maiuscoli usando la seguente sintassi:
grep 'A-Z' nomefileLe parentesi quadre ti permettono di determinare l'intervallo di caratteri. Nell'esempio sopra corrisponde a qualsiasi carattere che si trova tra A e Z.
Pertanto per far corrispondere i caratteri minuscoli è possibile utilizzare la seguente sintassi:
grep 'a-z' nomefileSe vuoi abbinare solo lettere e non numeri o altri simboli puoi usare la seguente sintassi:
grep 'a-zA-Z' nomefilePuoi fare lo stesso con i numeri come segue:
grep '0-9' nomefile ' 08 di 09Alla ricerca di pattern ripetuti usando grep
Puoi usare le parentesi graffe {} per cercare un motivo ripetuto.
Immagina di avere un file con numeri di telefono come segue:
- 055-1234
- 055-4567
- 555-1545
- 444-0167
- 444-0854
- 4549-2234
- x44-1234
Sai che la prima parte del numero deve essere di tre cifre e vuoi trovare le linee che non corrispondono a questo schema.
Dall'esempio precedente sai che 0-9 restituisce tutti i numeri in un file.
In questo caso vogliamo le linee che iniziano con tre numeri seguiti da un trattino (-). Puoi farlo con la seguente sintassi:
grep "^ 0-9 0-9 0-9 -" numeriCome sappiamo dagli esempi precedenti, il carat (^) significa che la linea deve iniziare con il seguente schema.
0-9 cercherà qualsiasi numero compreso tra 0 e 9. Poiché questo è incluso tre volte corrisponde a 3 numeri. Infine c'è un trattino per indicare che un trattino deve avere successo con i tre numeri.
Usando le parentesi graffe puoi rendere la ricerca più piccola come segue:
grep "^ 0-9 {3 } -" numeriLa barra sfugge alla {parentesi in modo che funzioni come parte dell'espressione regolare, ma in sostanza ciò che sta dicendo è 0-9 {3} che significa qualsiasi numero compreso tra 0 e 9 tre volte.
Le parentesi graffe possono anche essere utilizzate come segue:
{5,10}{5,}{5,10} significa che il carattere cercato deve essere ripetuto almeno 5 volte ma non più di 10 mentre il {5,} significa che il personaggio deve essere ripetuto almeno 5 volte, ma può essere più di quello.
Continua a leggere sotto
09 di 09Uso dell'output da altri comandi Uso di grep
Finora abbiamo esaminato la corrispondenza dei modelli all'interno dei singoli file, ma grep può utilizzare l'output di altri comandi come input per la corrispondenza dei pattern.
Un ottimo esempio di ciò è l'utilizzo del comando ps che elenca i processi attivi.
Ad esempio, esegui il seguente comando:
ps -efVerranno visualizzati tutti i processi in esecuzione sul tuo sistema.
Puoi utilizzare grep per cercare un particolare processo in esecuzione come segue:
ps -ef | grep firefoxSommario
Il comando grep è un comando fondamentale di Linux ed è uno che vale la pena di imparare in quanto renderà la vita molto più facile durante la ricerca di file e processi quando si utilizza il terminale.




