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.

Altri contenuti che potrebbero interessarti

  • Redmine e Ubuntu
    Quando si lavora (come sviluppatori, ma anche in altre occasioni) in un team è quasi fondamentale avere un sistema per la gestione del codice oltre ad un sistema per la gestione del progetto. Inizialmente avevo utilizzato trac, strumento ottimo, ma con alcuni vincoli, il più evidente: essere...
  • Nell'articolo precedente abbiamo visto come procedere all'installazione di redmine su apache, abbiamo visto come integrare git e gitosis per la gestione delle credenziali degli utenti.. ma alla fine avevamo specificato che c'era ancora qualche problema da risolver. Di seguito vediamo come...
  • In questo articolo vedremo come collgare un dispositivo multimediale portatile ad un computer con installato una versione del sistema operativo GNU/Linux tramite protocollo MTP. Il protocollo MTP (Media Transfer Protocol) è l'evoluzione del PTP (Picture Transfer Protocol), sviluppato da...
  • Questa breve guida si prefigge lo scopo di installare un mailserver per l'invio di posta all'interno di un organizzazione con una serie di utenti che possono accedere sia tramite un qualsiasi client di posta (Outlook, Outlook Express, Thunderbird, Evince, ...) che tramite una webmail ospitata sul...

Commenti

Ritratto di eliosh

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> <table> <thead> <tbody> <tr> <th> <td>
  • 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