Find in file from shell

 

Capita a volte di avere la necessità di cercare all'interno di un gruppo di file una stringa, ancora più spesso capita di dover scoprire in quale file all'interno di una cartella c'è la stringa che cerchiamo, e magari anche in che posizione, il tutto evitandoci di cercare nelle cartelle create dal nostro VCS. Vediamo ora come effettuare una ricerca in maniera veloce.

Come prima poca potremmo estrarre il contenuto di tutti i file usando il comando cat e poi filtrare la parte che ci interessa usando grep, soluzione improvvisata e che a volte può essere utile; molto meglio, invece, è lascia fare tutto a grep.

Per fare questo usiamo il comando grep indicando la stringa da cercare, andando ad aggiungere anche una serie di comandi, tra cui:

-n
Per indicare di visualizzare il numero della riga della stringa cercata nel file.
-r
Per indicare che si tratta di una ricerca ricorsiva, comprendente anche le subdirectory.
--color
Indica che l'output deve essere visualizzato utilizzando i colori per evidenziare i diversi elementi, rendendo più semplice la comprensione del risultato.
--exclude-dir
Ci permette di escludere alcune directory dalla ricerca

Usando la combinazione di questi ci permette di effettuare la ricerca di una stringa saltando tutte le directory che non ci interessano (le directory con i dati di CVS o .svn), per esempio:

grep --color -n -r --exclude-dir=.svn MISTRINGA ./

permette di ottenere tutte le occorrenze della parola MIASTRINGA nei files presenti in tutte le directory a partire dalla directory corrente.

Per rendere più comoda l'esecuzione della ricerca possiamo creare un mini script bash che ci faccia da scorciatoia (potremmo effettuare anche un alias, dipende da cosa vogliamo). Creiamo un file nella directory /usr/sbin, e inseriamo in questo le righe (rendendo poi il file eseguibile):

#!/bin/sh
grep --color -n -r --exclude-dir=.svn $1 ./

Per rendere comoda la creazione potete lanciare i seguenti comandi:

sudo su -c "echo \#\!\/bin\/sh > /usr/sbin/ff"
sudo su -c "echo 'grep --color -n -r --exclude-dir=.svn \$1 ./' >> /usr/sbin/ff"
sudo chmod 555 /usr/sbin/ff

a questo punto per trovare la posizione di una stringa possiamo dare, dalla directory da cui vogliamo far partire la ricerca, il comando:

ff STRINGA_CERCATA

Lo script l'ho chiamato ff per comodita nella digitazione e perché Find in File mi pareva un nome facilemente ricordabile. Come output del comando otterremo una serie di stringhe che ci indicano dove sarà la stringa cercata nei diversi files in cui è presente; verrà generanto un output simile a:

ff STRINGA_CERCATA

./file.txt:20: questa è la STRINGA_CERCATA nel file
./directory/file.txt:3: questa è un altra occorrenza della STRINGA_CERCATA

Questo comando diventa molto comodo per trovare all'interno di server a cui si accede in SSH dove andare a trovare i file a cui mettere mano. Inoltre, escludendo le directory .svn (o .git, CVS, ... in base al sistema di versioning che usate), permette di effettuare la ricerca velocemente anche sulla macchina locale, per esempio quando non si vuole caricare netbeans e il progetto completo per cercare una stringa.

Commenti

Ritratto di Anonimo

Ottima idea.

Ottima idea.

Ritratto di mavimo

Grazie...

...non è un ottima idea, ma un idea utile :D

Invia nuovo commento





  • Elementi HTML permessi: <a> <em> <strong> <cite> <code> <ul> <ol> <li> <dl> <dt> <dd> <img> <h2> <h3> <h4>
  • You may post code using <code>...</code> (generic) or <?php ... ?> (highlighted PHP) tags.
  • Linee e paragrafi vanno a capo automaticamente.
  • Indirizzi web o e-mail vengono trasformati in link automaticamente

Maggiori informazioni sulle opzioni di formattazione.



Condividi contenuti