Crea sito

Ricerca multipla con grep (grep multiple arguments)

Supponiamo di dover cercare 2 o più parole all’interno di una stringa e che la condizione da verificare sia un AND, ossia le parole da ricercare devono essere presenti contemporanemente nella stessa stringa. La richiesta può essere esaudita usando 2 o più grep in pipe “|“:

[email protected]:~$ echo -e "1 - pippo pluto paperino\n2 - pluto minni" | grep "pluto" | grep "minni"
2 - pluto minni

Una soluzione più elegante è di farlo in un unico comando coivolgendo le espressioni regolari:

[email protected]:~$ echo -e "1 - pippo pluto paperino\n2 - pluto minni"
1 - pippo pluto paperino
2 - pluto minni
[email protected]:~$ echo -e "1 - pippo pluto paperino minni\n2 - pluto minni" | grep -E 'pluto.*minni'
1 - pippo pluto paperino minni
2 - pluto minni

Il “.*” è un’espressione regolare, il punto corrisponde a un singolo carattere ma seguito a da un asterisco significa qualsiasi cosa, anche niente.

[email protected]:~$ echo -e "1 - pippo pluto paperino topo\n2 - pluto minni\n3 - topolino" | grep -E 'topo.*lino'
3 - topolino

Se voglio evidenziare solo la parte di linea i cui caratteri corrispondono al pattern ricercato uso l’opzione o del comando grep:

[email protected]:~$ echo -e "1 - pippo pluto paperino minni\n2 - pluto minni" | grep -Eo 'pluto.*minni'
1 - pluto paperino minni
2 - pluto minni

Se invece vogliamo una ricerca in cui l’operatore è l’OR invece dell’AND si usa la seguente sintassi nel grep:

[email protected]:~$ echo -e "1 - pippo pluto paperino\n2 - pluto minni" | grep -E 'minni|pippo'
1 - pippo pluto paperino
2 - pluto minni

Infine volevo indicare un metodo alternativo al grep usando il comando awk per ottenere lo stesso risultato di ricerca:

[email protected]:~$ echo -e "1 - pippo pluto paperino\n2 - pluto minni" | awk '/pluto/ && /minni/'
2 - pluto minni
[email protected]:~$ echo -e "pippo pluto paperino\npluto minni" | awk '/minni/ || /pippo/'
1 - pippo pluto paperino
2 - pluto minni

Leave a Reply

Il tuo indirizzo email non sarà pubblicato.

*