back to top

Linux locate e grep – cercare tra file e cartelle

Nella lezione precedente abbiamo visto come utilizzare il comando find di Linux per effettuare ricerche all’interno del filesystem. In realtà find non è l’unico strumento di ricerca fornito dal sistema operativo. In questa lezione vedremo nel dettaglio come funzionano i comandi locate e grep di Linux.

Il comando locate

Il modo più semplice e veloce per cercare file o directory ci è offerto dal comando locate che effettua ricerche sulla base del nome dei file. Il suo funzionamento è semplicissimo: è sufficiente accompagnare locate al termine che si vuole cercare. Il risultato sarà un elenco di file e directory che contengono nel loro nome e percorso la parola che si è cercato.

locate termine_da_cercare

Se, ad esempio, volessimo cercare nel nostro server tutti i file che si chiamano "pippo.jpg", come già visto nell’esempio riguardante il comando useremo:

locate pippo.jpg

Il comando in questione è molto comodo, ad esempio, se non ricordiamo la posizione esatta di un file come ad esempio php.ini. Digitando:

locate php.ini

Otterremo in risposta qualcosa del genere:

/etc/php7/cgi/php.ini
/etc/php7/cli/php.ini
/etc/php7/fpm/php.ini
/usr/share/doc/php7-common/examples/php.ini-development
/usr/share/php7/php.ini-production
/usr/share/php7/php.ini-production.cli

Attenzione: la ricerca è case sensitive, cioè distingue tra maiuscole e minuscole. Per effettuare ricerca NOn case sensitive si aggiunga l’opzione -i in questo modo:

locate pippo.jpg -i

Così facendo otterremo anche "Pippo.jpg" o "PIPPO.jpg".

Un’altra utile opzione è quella che consente di limitare il numero dei risultati. L’opzione in questione è -n e deve essere seguita dal numero di risultati da mostrare. L’utilità di questa opzione si rivela in ricerche molto generiche che potrebbero produrre moltissimi risultati:

locate .jpg -n 50

Con questo comando stiamo cercando tutti i file con estensione JPG limitando a 50 i risultati da stampare a video.

Aggiornare l’indice di locate

Il comando locate è davvero velocissimo! Il perchè di questa velocità sta nel fatto che in realta il comando in questione non effettua una ricerca real-time tra i file della macchina, ma si limita a spulciare un apposito indice contenente informazioni sui files presenti nella macchina in un dato momento. E’ pertanto importante tenere aggiornato questo database usando, di volta in vola, l’apposito comando, ovvero updatedb.

Il comando grep

Per finire questa nostra lezione vediamo un ultimo, utilissimo comando: grep. Con grep possiamo cercare i file che conengono una determinata parola o una determinata stringa di testo. La sintassi è la seguente:

grep pattern_di_ricerca file_in_cui_cercare

Poniamo, per fare un esempio, di voler cercare tutti i file con estensione ".html" che contengono la parola "casa":

grep casa *.html

Grazie alla sintassi qui sopra verrà cercata la stringa "casa" tra tutti i file HTML (l’asterisco, infatti, sta ad indicare "qualsiasi cosa" – c.d. wildcards – ed è utilizzato, nel nostro esempio, per cercare ogni files con estensione .html).

Da notare che nel nostro esempio abbiamo cercato non la parola "casa", ma la stringa "casa"! Ne consegue che nei risultati potremo trovare anche files che contengono, ad esempio, la parola "casale" o "casata".

Se avessimo voluto cercare solo la parola "casa" avremmo dovuto usare l’opzione -w (word) in questo modo:

grep -w "casa" *.html

Effettuare ricerche ricorsive con grep

Facciamo un altro esempio: poniamo di voler sapere se all’interno del file "spesa.txt" è presente la parola "zucchero".Per farlo sarà sufficiente digitare nella shell di Linux la seguente istruzione:

grep "zucchero" spesa.txt

sulla base di questa istruzione, grep restituirà tutte le linee del file indicato che contengono la parola cercata. Visto così, potrebbe non sembrare un granchè… facciamo quindi qualche altro esempio che ci aiuti a capire quanto possa essere importante questo comando.

Poniamo di voler cercare sempre la parola "zucchero" non più in un singolo file, ma in tutti i file presenti in una data directory e nelle sue eventuali sub-directory:

grep -r "zucchero" /home/listespesa/

Nell esempio qui sopra abbiamo utilizzato grep con opzione ricorsiva (-r) per andare a scovare, non solo nella dir indicata ma anche in tutte le eventuali sub-directory, la presenza di file contenenti la parola indicata.

Utilizzare grep con le regular expressions

Il comando grep esprime la sua vera forza nel suo utilizzo combinato con le regular expressions (espressioni regolari). Nonostante questo argomento sia troppo lungo e complesso da affrontare in modo approfondito in questa sede, ritengo opportuno almeno un cenno a due caratteri speciali che, sono certo, saranno amici di molte vostre ricerche… sto parlando di punto (".") e asterisco ("*").

Il punto (.) può essere utilizzato per indicare un (nota bene: uno solo) carattere qualsiasi. Facciamo un esempio: poniamo di aver archiviato sul nostro computer le recensioni di centinaia di film visti in TV. Poniamo che ogni scheda sia stata scritta in un separato file txt. Ora supponiamo di voler cercare tra queste schede tutti i film di "Michelle Pfeiffer" ma poniamo di non ricordare esattamente come si scrive "Pfeiffer". Che fare? Semplice… ricorriamo al comando grep in combinazione con il punto (.). Scriviamo solo la parte di parola di cui siamo certi e sostituiamo con dei puntini le lettere di cui non siamo sicuri, così:

grep -r "pf..ffer" /home/videoteca/

Nell’esempio abbiamo messo due punti i quali indicano le lettere "ei" di cui non eravamo certi.

Ora consideriamo un’altra ipotesi: supponiamo di ricordare solo che il nome che stiamo cercando finisce con "ffer" e niente più:

grep -r "*ffer" /home/videoteca/

Questa istruzione ritornerà tutti i file in cui è presente una qualsiasi parola che termina con "ffer" in quanto il simbolo asterisco (*) indica non uno, bensì un arbitrario numero di lettere (0,1,2,10,100,…).

Pubblicitร 
Massimiliano Bossi
Massimiliano Bossi
Stregato dalla rete sin dai tempi delle BBS e dei modem a 2.400 baud, ho avuto la fortuna di poter trasformare la mia passione in un lavoro (nonostante una Laurea in Giurisprudenza). Adoro scrivere codice e mi occupo quotidianamente di comunicazione, design e nuovi media digitali. Orgogliosamente "nerd" sono il fondatore di MRW.it (per il quale ho scritto centinaia di articoli) e di una nota Web-Agency (dove seguo in prima persona progetti digitali per numerosi clienti sia in Italia che all'estero).