Indice dei contenuti
Toggle
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 ๐