Indice dei contenuti
ToggleLo confesso, più imparo a conoscere grep e più lo adoro per le enormi potenzialità nella ricerca, e non c’è giorno che non mi torni utile sfogliando enormi file di log o altre ricerche sui server che gestisco.
Allo stesso tempo mi fa paura, perché le funzionalità sono immense, e mi costringe ad uno studio continuo.
Imparo lentamente, perché l’argomento è particolarmente vasto considerato poi che grep esprime il meglio delle sue potenzialità in combinata con le espressioni regolari, un vero buco nero per me, ma ad ogni piccola scoperta sono grandi soddisfazioni.
Qualcuno mi ha chiesto “ma perché ti ostini a cercare di imparare questo grep, quando i sistemi operativi offrono tanti strumenti per le ricerche con delle interfacce comodissime?”
Probabilmente non hanno mai dovuto fare delle ricerche in file di testo particolarmente grandi, come i file di log dei server ad esempio, e rimanere stupiti da quanto sia veloce grep, mentre con altri sistemi conviene lanciare la ricerca e poi andare in pausa caffe, sempre che al ritorno abbia già finito.
Per tenere traccia di alcune di queste potenzialità, quelle che imparo via via e che possono tornarmi utili in futuro, ho pensato che poteva essere utile un “grep for dummies” formato di tanti appunti, partendo dalle cose basilari, e da implementare di volta in volta. Magari qualcuno più dummies di me alla fine mi offrità una birra… 🙂
Cercare con grep
Negli esempi a seguire, supponiamo di dover effettuare delle ricerche in uno o più ipotetici fileditesto.txt
Giusto per partire proprio dai fondamentali, il comando base da cui tutto nasce è
grep stringadacercare fileditesto.txt
dove supponiamo di dover cercare il testo stringadacercare all’interno del file fileditesto.txt
In questo caso si è utilizzato il comando grep senza alcuna opzione, per avere la lista delle opzioni disponibili viene in aiuto il classico comando man grep.
Se l’espressione da cercare è composta di più parole, dovremo chiuderla tra i classici apicini (”)
grep 'stringa da cercare' fileditesto.txt
Cercare con grep su più documenti
Mettiamo di dover cercare su diversi file, basta indicare uno dopo l’altro i file interessati, separati da uno spazio
grep stringadacercare fileditesto.txt fileditesto1.txt fileditesto2.txt
possiamo però utilizzare l’asterisco per semplificare il comando, dove possibile
grep 'stringa da cercare' fileditesto*
oppure cercare in tutti i file della stessa directory dove ci troviamo, grazie sempre alla wilcard “*” utilizzata nell’esempio precedente (e che tornerà utile in mille altri modi)
grep 'stringa da cercare' *
ed estendere la ricerca in modo ricorsivo, ossia anche alle sotto-directory, con l’opzione -R, e limitandola ai soli files con estensione txt
grep -R 'stringa da cercare' *txt
Affinare la ricerca con grep
Tra le tante opzioni per migliorare le nostre ricerche, cheome abbiamo già visto in un paio di esempi vanno messe tre il comando grep e la stringa da cercare, alcune tornano molto utili e tra queste
- – i (case insensitive) grep di suo e case sensitive, ossia per lui c’è una bella differenza tra minuscole e maiuscole. Con questa opzione la ricerca diventa case INsensitive, ossia minuscole o maiuscole tutto fa brodo.
- -x grep cerca una stringa di testo, anche se questa fa parte di una stringa più complessa. Cioè se cerchiamo la stringa palo, grep ci riporterà come buone anche le ricorrenze per palombaro, palombella e rippalo. Con l’opzione -x grep riporta solo le righe contenenti la parola completa, intera, ovvero solo palo.
- -l questa opzione è utilissima quando ci interessa non tanto sapere quante ricorrenze all’interno di uno o più files, ma solo sapere quali sono i files contenenti eventuali ricorrenze, evitandoci un lungo output da ripulire.
- -L uguale all’opzione precedente, ma riporta solo i nomi dei file dove la ricerca NON ha avuto successo.
- -v (invert-match) utilizzando questa opzione si inverte la ricerca, ossia grep ci mostra tutte le righe che non contengono la stringa ricercata.
Cercare con grep più stringhe di testo contemporaneamente
Poniamo il caso di dover cercare due parole in uno o più documenti. È una delle cose più recenti che mi è capitato di affrontare, e mi ha salvato l’operatore “\|”, obbligatorie le virgolette in questo caso.
Mettiamo il caso di dover cercare le (classiche) stringhe pippo o pluto, individuare cioè tutte le righe che contengono la stringa pippo o la stringa pluto, la sintassi del nostro comando sarà
grep 'pippo\|pluto' fileditesto*.txt
la risposta sarà una cosa simile a questa, dove vengono riportate le ricorrenze per ogni files
fileditesto.txt:pippo
fileditesto.txt:pluto
fileditesto1.txt:pippo
fileditesto1.txt:pluto
fileditesto2.txt:pluto
fileditesto2.txt:pippo
Cercare con grep: modificare il risultato della ricerca
Con grep è possibile modificare il modo in cui viene presentato il risultato della ricerca, ci sono molte opzioni per questo scopo.
Le più utili che ho individuato sono:
- -n riporta il numero della riga per ogni ricorrenza
- -c riporta il numero delle ricorrenze trovate
- –num (es. -10) riporta anche le num righe prima e dopo ogni ricorrenza trovata (nell’esempio 10 righe)
- -A num (es. -A 10) riporta le num righe successive (after) di ogni ricorrenza trovata (nell’esempio 10 righe)
- -B num (es. -B 10) riporta le num righe precedenti (before) di ogni ricorrenza trovata (nell’esempio 10 righe)
- -h non riporta i nomi dei files quando la ricerca è effettuata su più files
- -s non riporta i messaggi di errore per eventuali documenti non trovati o non leggibili
Per ora ci fermiamo qui, credo di aver messo già abbastanza carne sul fuoco per chi come me ha tutto da imparare con grep, anche perché con un minimo di padronanza con le opzioni fin qui descritte si possono già effettuare ricerche molto fruttuose.
Ho già in cantiere un secondo articolo su grep e le use opzioni, con qualcosina di più avanzato.
Nel frattempo, se anche voi volete arricchire questo “piccolo manualetto grep per dummies”, sarò ben lieto di aggiungere i vostri suggerimenti, i commenti sono a vostra completa disposizione. 😉
Picture credit: J. W. Baker
4 risposte
Grazie! Le segnalo un piccolo refuso, le opzioni -A e -B sono invertite, è facile anche ricordarlo perché sono le iniziali di After (dopo) e Before (prima)
Opperbacco, grazie della segnalazione!!!
rob
Se pur del 2009 ho trovato questo articolo molto utile…saluti!
Grazie 😉