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 ;) ?






