Scritto da Giambo il 04/09/2007, in OpenSource, Tutorial

Grep e' uno strumento potente per la ricerca nei files. Talmente potente che e' una delle prime cose che installo su una macchina Windows sulla quale so dovro' lavorare per un certo periodo di tempo.
Il "cagnolino-che-cerca-scavando" di Windows XP, semplicemente, non ce la fa :)

Poniamo di avere il seguente file di testo:

giambo@deimos:~$ cat testo.txt
Pippo
Paperino
Nonna Papera
Qui Quo Qua
Amelia

E vogliamo cercare per "Paperino":

giambo@deimos:~$ grep paperino testo.txt
Paperino

Per cercare senza tener conto del "case" (Maiuscole/minuscole), usiamo l'opzione "-i" (Ignore-case):

giambo@deimos:~$ grep -i pApErInO testo.txt
Paperino

"Pffft, l'elegante levriero di XP fa questo e altro !" qualcuno di voi obbiettera'.
Passiamo allora a qualcosa di piu' complesso: Cerchiamo "Paperino" ma mostriamo pure la riga precedente (-B = Before) e le due righe seguenti (-A = After)

giambo@deimos:~$ grep Paperino testo.txt -A2 -B1
Pippo
Paperino
Nonna Papera
Qui Quo Qua

Cerchiamo tutti i personaggi tranne la nonna (-v = invert-match), ignorando il case (-i) e stampando il numero di riga (-n)

giambo@deimos:~$ grep -vin nonna testo.txt
1:Pippo
2:Paperino
4:Qui Quo Qua
5:Amelia

Ora vogliamo tutte le righe che non contengono pippo o nonna. Potemmo usare due volte grep, una volta filtrando con -v "pippo" e filtrando questo risultato alla stessa maniera per "nonna".
Oppure possiamo usare l'operatore "\|". In questo caso la stringa da cercare deve essere posta tra virgolette:

giambo@deimos:~$ grep -niv "nonna\|pippo" testo.txt
2:Paperino
4:Qui Quo Qua
5:Amelia

Ovviamente possiamo cercare anche in piu' files. Poniamo di avere pure questo file di testo:

giambo@deimos:~$ cat testo2.txt
PippoFranco
Nonna Abelarda

Se vogliamo cercare "pippo" in entrambi:

giambo@deimos:~$ grep -in pippo testo.txt testo2.txt
testo.txt:1:Pippo
testo2.txt:1:PippoFranco

E se ci interessa solo il nome del file:

giambo@deimos:~$ grep -il pippo testo.txt testo2.txt
testo.txt
testo2.txt

Per cercare solo la parola intera, possiamo usare l'opzione "-x"

giambo@deimos:~$ grep -x Pippo testo*.txt
testo.txt:Pippo

L'amico PippoFranco e' stato ignorato :)
Da notare l'uso della wildcard "*" per il nome del file; se avessimo voluto cercare anche nelle sottodirectories, allora "-r" (Recursive) fa al caso nostro:

giambo@deimos:~$ grep -r pippo *
[Segue output molto lungo di cose mie private :P]

E per concludere l'opzione "-c" che ci mostra quante volte la parola cercata e' stata identificata:

giambo@deimos:~$ grep -c P testo*.txt
testo2.txt:1
testo.txt:3


Pheeew, credo che per ora possa bastare ... Siete ancora svegli ;) ?

Hai trovato l'articolo interessante?
Sottoscrivi il Feed RSS per essere informato automaticamente degli ultimi aggiornamenti!
 
.Commenti rss
# 1
Grandissimo Giambo :-)
Di davidonzo  (Inviato il 04/09/2007 @ 09:29:54)
# 2
WOW, che dire...grandioso
Di Philip J. Fry  (Inviato il 04/09/2007 @ 10:16:32)
# 3
Grande!!!
Di lorenzone92  (Inviato il 04/09/2007 @ 11:31:52)
# 4
Davidonzo, che fai ? Posti come "Philip J. Fry" e come "lorenzone92" per farmi contento :D ?
Di Giambo  (Inviato il 04/09/2007 @ 17:11:57)
# 5
Strunzu!
Il mio era un commento volto a spingerti a postare di più!

Te l'ho detto: apri un blog e di do tutto l'ambaradan.
Tu sei blogger dentro!
Di davidonzo  (Inviato il 04/09/2007 @ 17:20:20)
# 6
Ah ma l ha fatto Giambo? allora complimenti :-D
Di cadex1  (Inviato il 04/09/2007 @ 21:25:03)
# 7
A proposito della potenza di greep.

Cercare una riga in un file sql di oltre 500MB non è un problema!

Gli editor di testo, seppur buoni come gedit o VIM, fanno fatica ad aprire file di enormi dimensioni.
Con greep si evita il display di un sacco di righe inutili quando si procede ad un detect di riga.

Il matching dura meno di un secondo e si riesce a reperire la posizione precisa della stringa!
Di davidonzo  (Inviato il 05/09/2007 @ 15:03:49)


I commenti possono essere moderati.
Se non lo vedi comparire subito non reinserirlo più volte.
Grazie per la gentile collaborazione.