grep, the Great and Powerful

grep

Gennaio 2012. Piena tesi triennale. Con un mio collega stavamo lavorando su un framework che sputava fuori risultati in una serie di file di testo. Centinaia, migliaia di file di testo. Dovevamo trovare un modo di estrarre da ogni file di testo una specifica riga per creare una tabella dei risultati da mettere su LaTeX. Questo è stato il nostro primo incontro con grep.

Il comando grep (general regular expression print) è uno dei comandi più potenti messi a disposizione dai sistemi Linux. Permette la ricerca di una particolare stringa o di un pattern all'interno di uno o più file di testo. Si parla di pattern poichè, come dice anche l'acronimo, grep è stato creato in generale per ricercare espressioni regolari, argomento che sarà trattato in un futuro articolo.Per ora, limitiamoci a vedere alcune delle tante possibilità che ci fornisce il comando grep, ricordandoci sempre che per qualsiasi dubbio con i comandi Linux vi basterà un man grep o un grep --help.

Partiamo dalla base: cercare una stringa "hello world" all'interno di un file di testo "prova.txt":

grep "hello world" /path/del/file/prova.txt

Immaginiamo adesso di avere una cartella con tanti file di testo e di voler ricercare tutte le occorrenze della stringa "hello world" all'interno dei file:

grep -r "hello world" /path/della/cartella/

Se poi volessimo cercare la stringa solo nei file .txt e .csv all'interno della cartella, il comando sarebbe:

grep -r "hello world" /path/della/cartella/*.{txt,csv}

Esistono poi diverse opzioni interessanti da potere concatenare con gli esempi precedenti:

  • -r: come visto in precedenza, ricerca ricorsivamente il pattern all'interno della cartella e delle sue sottocartelle
  • -i: ricerca il pattern in modalità case-insensitive
  • -n: restituisce i numeri di riga dei file dove presente il pattern ricercato
  • -c: restituisce il numero di occorrenze del pattern cercato
  • -w e -x: restituisce solo i casi in cui il pattern è, rispettivamente, una parola intera o una riga intera del file di testo
  • -v: restituisce i file in cui NON è presente la stringa o la regex indicata nel comando
  • -l e -L: con questo comando sono stampati solo i file che, rispettivamente, contengono il pattern o non contengono il pattern

Oltre a queste opzioni, ne esiste una molto utile se dovete invece ricercare un pattern escludendo una o più tipologie di file (come i file di log o i binari di un progetto):

grep -r --exclude="/*.log" "hello world"

La vera potenza di grep si esprime però concatenando il comando con altre istruzioni Linux tramite pipe (simbolo |). L'esempio più banale può essere l'utilizzo di grep per ricercare, per esempio, tutti i processi avviati da root

ps -ax | grep root

Oppure, come era stato suggerito mesi fa in una pillola, grep può essere utilizzato per visualizzare un file di configurazione senza i commenti (righe che iniziano con #) utilizzando una semplice espressione regolare:

grep -vE "^\s*#|^$" <your_file>

Un altro comando con una discreta sinergia con grep è il comando sort, utilizzato per ordinare i risultati di grep. Il comando sort meriterebbe un focus a parte, ma per ora ci limiteremo ad utilizzarlo soltanto per ordinare numericamente secondo il PID i processi di root:

ps -ax | grep root | sort -n

Come avete visto, le possibilità sono tante grazie alla potenza del comando. Vi invitiamo come sempre a commentare con domande, dubbi, precisazioni e, se avete voglia, casi particolari in cui grep vi ha salvato la vita.

Alessio Antonielli

Ingegnere informatico, appassionato di cinema, musica, videogiochi e serie tv. Insomma, le solite cose che vi aspettereste da un ex studente di Ingegneria Informatica, giusto per rafforzare lo stereotipo…

grep, the Great and Powerful ultima modifica: 2016-04-12T11:48:30+00:00 da Alessio Antonielli


Advertisment ad adsense adlogger