Grep, cose utili da sapere

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 πŸ˜‰ ?

12 thoughts on “Grep, cose utili da sapere”

  1. 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!

  2. 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

  3. 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 πŸ™‚

  4. 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 !!!

  5. Che io sappia, non e' possibile, anche perche' il risultato sarebbe ambiguo: Se ci fosse una riga "pippo numero 30", quale sarebbe il risultato ?

Comments are closed.