Skip to main content

grep

Grep, Egrep ed Fgrep

Grep è un programma utilizzato generalmente per ricercare testo o pattern specifici, per utilizzare le regular expressions, dobbiamo ricordare di utilizzare il flag "-P" e per evitare conflitti è buona norma sempre utilizzare apici singoli come argomento stringa di grep. Alcuni esempi di utilizzo di grep possono essere:

 grep stringaDaCercare nomeFile
 # per cercare la stringa
 # stringaDaCercare all'interno del file nomeFile
 grep -i stringaDaCercare nomeFile
 # in questo caso, ignoro il
 # fatto che stringaDaCercare sia maiuscola o minuscola, effettuo
 # una ricerca case-insensitive
 grep -A4 stringaDaCercare nomeFile
 # cerca stringaDaCercare in
 # nomeFile e stampa la riga contenente la stringa più le 4 righe
 # successive (il flag "-A" sta per "after")
 grep -B4 stringaDaCercare nomeFile
 # cerca stringaDaCercare in
 # nomeFile e stampa la riga contenente la stringa più le 4 righe
 # precedenti (il flag "-B" sta per "before")
 grep -w 'M'
 # in questo caso viene cercata proprio una parola
 # isolata M, 'w' sta per "word", ad esempio nel caso dovessimo
 # cercare la cartella 'M' e non avere in output tutte le cartelle
 # che contengono la parola M possiamo usare "ls -l | grep M"
 grep -c hello nomeFile
 # mi dice quante volte la parola "hello"
 # è contenuta nel file nomeFile
 grep [bde] nomeFile
 # evidenzia tutti i caratteri b, d ed e
 # all'interno del file nomeFile
 grep -P '\b4(?!000)[[:digit:]]{3}\b' nomeFile
 # cerca tutte le
 # stringhe che contengono numeri compresi tra 4000 e 5000
 # (estremi esclusi)
 grep --color=auto keyword nomeFile
 # in questo modo la stringa
 # cercata verrà evidenziata con un colore diverso (molto utile!)

E' possibile anche utilizzare regular expressions complesse utilizzando il flag "-P" per feature più avanzate (tipo lookaheads e lookbehinds) come:

 # '^word' che significa, le linee che iniziano con la parola "
 # word"
 # 'word$' che significa, le linee che finiscono per "word"
 grep [a-g] testf
 # in questo esempio, vengono evidenziati tutti
 # i caratteri compresi tra la "a" e la "g" nel file testf
 grep ^[a-g] testf
 # in questo esempio, vengono evidenziate le
 # parole che finiscono per uno dei caratteri compresi tra la "a"
 # la "g" all'interno del file testf
 grep -f grepinput testf
 # prende come input pattern, il
 # contenuto del file1 per ricercare all'interno di file2
 grep -r 'modules' .
 # a partire dalla corrente directory
 # scandisce ogni file con all'interno la parola "modules"
 grep -v 'permission denied'
 # mostra tutte le stringhe che non
 # contengono la stringa indicata, quindi il flag "-v" è il flag
 # di negazione, utile per cercare stringhe che non contengono
 # quella voce
 grep -n 'word'
 # esegue un normale grep, ma indica il numero di
 # linea a cui è stata trovata la parola cercata
 grep -nir 'word' .
 # a partire dalla corrente directory
 # scandisce ogni file con all'interno la parola "word" non è case
 # sensitive ed indica il numero di linea a cui è stata trovata la
 # parola menzionata
 grep -lr cron /etc
 # elenca tutti i file che contengono la
 # parola "cron" all'interno del loro nome all'interno della
 # directory "/etc", il flag "l" sta per list o elenca, mentre il
 # flag "r" permette di effettuare l'operazione ricorsivamente in
 # tutte le sottodirectory di /etc.
 grep -F -x -v -f fileB fileA
 # mostra tutte le righe di A senza
 # le righe nel file B; this works by using each line in fileB as
 # a pattern (-f fileB) and treating it as a plain string to match
 # (not a regular regex) (-F). You force the match to happen on
 # the whole line (-x) and print out only the lines that don't
 # match (-v). Therefore you are printing out the lines in fileA
 # that don't contain the same data as any line in fileB.
 # Un'alternativa a questo è "comm <(sort a) <(sort b) -3" che
 # stampa le righe di differenza tra i due file "a" e "b".
 grep -aob "y" file.txt
 # mostra tutte le posizioni in cui
 # compare la lettera "y" nel file chiamato file.txt

N.B.: Quando si vogliono usare regex complesse, oltre ad usare il flag "-P" (che comunque provoca conflitti se usato con egrep) dobbiamo mettere la stringa tra singoli apici e non tra doppi apici, per sicurezza possiamo comunque mettere sempre le stringhe di grep tra singoli apici nel dubbio.

We can use it to include/exclude the list of pictures from a website with "grep ^=".

Ci sono due varianti del comando grep:

 egrep
 # equivalente ad eseguire un "grep -E"
 fgrep
 # equivalente ad eseguire un "grep -F"

Egrep è utilizzato per includere forme complesse di regular expressions (chiamate extended regular expressions). Vediamo alcuni esempi:

 egrep -i 'hello.*world' testf
 # mostra tutte le linee che
 # contengono sia la parola hello che la parola world (come
 # un'operazione AND logica) all'interno del file testf, il flag "
 # -i" indica la modalità case-insensitive
 egrep -i 'hello|world' testf
 # mostra tutte le linee che
 # contengono o la parola hello o la parola world (come
 # un'operazione OR logica) all'interno del file testf, il flag "
 # -i" anche in questo caso indica la modalità case-insensitive
 egrep -v 'hello|world' testfile
 # mostra tutte le linee che non
 # contengono la parola hello o la parola world, quindi il flag "
 # -v" effettua l'operazione negata rispetto a quella che verrebbe
 # effettuata di default

Fgrep è una forma di grep utile a cercare stringhe senza tener conto delle regular expression, quindi viene cercata la stringa così come scritta senza interpretare caratteri come ., |, $ , *, eccetera come caratteri speciali, vediamo qualche esempio:

 fgrep *hello$ testf
 # cerca esattamente la parola "*hello$"
 # senza intenderla come "regular expression", quindi i simboli
 # speciali non verranno intesi come caratteri jolly, comunque
 # tutto è fattibile da grep in quanto possiamo usare gli escape
 # characters, quindi la stessa cosa con grep sarebbe stata "grep
 # '\*hello\$' testf"