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 π ?
Grandissimo Giambo π
WOW, che dire…grandioso
Grande!!!
Davidonzo, che fai ? Posti come "Philip J. Fry" e come "lorenzone92" per farmi contento π ?
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!
Ah ma l ha fatto Giambo? allora complimenti π
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!
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
ops scusate, prima volevo scrivere:
grep '<.'
mi ero dimenticato il punto.
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:
Tutte le parola che iniziano per "cavallo":
Solo "cavallo":
Tutte le parole che terminano per "cavallo"
Nel tuo caso cerchi le parole che iniziano con qualsiasi carattere (Il punto), quindi praticamente tutte le singole parole nel file π
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 !!!
Che io sappia, non e' possibile, anche perche' il risultato sarebbe ambiguo: Se ci fosse una riga "pippo numero 30", quale sarebbe il risultato ?