Scritto da Giambo il 04/09/2007, in OpenSource, Tutorial
ATTENZIONE!
L'articolo che stai leggendo è stato scritto 1095 giorni orsono.
Le informazioni presenti potrebbero non essere aggiornate!

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)
# 8
ciao a tutti, se ho una cosa del genere:
grep '\<' cosa significa precisamente?qualsiasi linea del file?
il . cosa vuol dire in una grep?
grazie 1000
Di roger84  (Inviato il 26/06/2009 @ 20:46:39)
# 9
ops scusate, prima volevo scrivere:
grep '\<.'

mi ero dimenticato il punto.
Di roger84  (Inviato il 26/06/2009 @ 20:47:25)
# 10
Secondo la "man page" di grep:

The Backslash Character and Special Expressions
The symbols \< and \> respectively match the empty string at the
beginning and end of a word.


Praticamente sono dei delimitatori di parola :)

Esempio:
giambo@phobos:~$ cat testo.txt 
caciocavallo
cavallo
cavallopazzo


Tutte le parola che iniziano per "cavallo":
giambo@phobos:~$ grep '\<cavallo' testo.txt 
cavallo
cavallopazzo


Solo "cavallo":
giambo@phobos:~$ grep '\<cavallo\>' testo.txt 
cavallo


Tutte le parole che terminano per "cavallo"
giambo@phobos:~$ grep 'cavallo\>' testo.txt 
caciocavallo
cavallo


Nel tuo caso cerchi le parole che iniziano con qualsiasi carattere (Il punto), quindi praticamente tutte le singole parole nel file :)
Di Giambo  (Inviato il 28/06/2009 @ 13:20:44)
# 11
E' possibile usare grep per prendere intervalli di righe per es:

numero: 0
numero: 1
numero: 2
numero: 3
numero: 4
numero: 5
numero: 6
numero: 7
numero: 8
numero: 9
pippo numero :10
numero: 11
numero: 12
numero: 13
numero: 14
numero: 15
numero: 16
numero: 17
numero: 18
numero: 19
pippo numero:20
numero: 21
numero: 22
numero: 23
numero: 24
numero: 25
numero: 26
numero: 27
numero: 28
numero: 29
numero: 30
numero: 31
numero: 32
numero: 33
numero: 34
numero: 35
numero: 36
numero: 37
numero: 38

a me interesserebbe prendere le stringhe da

pippo numero :10
a
pippo numero:20

Come posso fare ??
Per favore AIUTATEMI !!!
Di Rino  (Inviato il 19/04/2010 @ 10:41:03)
# 12
Che io sappia, non e' possibile, anche perche' il risultato sarebbe ambiguo: Se ci fosse una riga "pippo numero 30", quale sarebbe il risultato ?
Di Giambo  (Inviato il 19/04/2010 @ 16:17:22)


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