Introduzione

grep è un potente strumento da riga di comando che consente di cercare in uno o più file di input le righe che corrispondono a un'espressione regolare e scrive ciascuna riga corrispondente nell'output standard.

In questo articolo, ti mostreremo come usare GNU grep per cercare più stringhe o pattern.

Grep Multiple Patterns

GNU grep supporta tre sintassi di espressioni regolari, Basic, Extended e Perl compatibile. Quando non viene specificato alcun tipo di espressione regolare, grep interpreta i modelli di ricerca come espressioni regolari di base.

Per cercare più pattern, utilizzare l'operatore di alternanza.

L'operatore di alternanza | (pipe) consente di specificare diverse possibili corrispondenze che possono essere stringhe letterali o set di espressioni. Questo operatore ha la precedenza più bassa di tutti gli operatori di espressioni regolari.

La sintassi per la ricerca di più schemi utilizzando grep per espressioni regolari di base è la seguente:

grep 'pattern1\|pattern2' file...

Racchiudere sempre l'espressione regolare tra virgolette singole per evitare l'interpretazione e l'espansione dei meta-caratteri da parte della shell.

Quando si usano espressioni regolari di base, i meta-caratteri vengono interpretati come caratteri letterali. Per mantenere i significati speciali dei meta-caratteri, è necessario usare una barra rovesciata (\). Questo è il motivo per cui stiamo effettuando l'escape all'operatore OR (|) con una barra.

Per interpretare il modello come un'espressione regolare estesa, invocare l'opzione grep con il parametro -E (o --extended-regexp). Quando si utilizza l'espressione regolare estesa, non fare l'escape dell'operatore |:

grep -E 'pattern1|pattern2' file...

Per ulteriori informazioni su come costruire espressioni regolari, consulta il nostro articolo Grep regex.

Stringhe multiple con Grep

Le stringhe letterali sono i modelli più elementari.

Nel seguente esempio, siamo alla ricerca di tutte le occorrenze delle parole fatal, error e critical nel file log di Nginx di errore:

grep 'fatal\|error\|critical' /var/log/nginx/error.log

Se la stringa che stai cercando include spazi, racchiudila tra virgolette doppie.

Ecco lo stesso esempio usando l'espressione regolare estesa, che elimina la necessità di sfuggire all'operatore |

grep -E 'fatal|error|critical' /var/log/nginx/error.log

Per impostazione predefinita, grep fa distinzione tra maiuscole e minuscole. Ciò significa che i caratteri maiuscoli e minuscoli vengono considerati distinti.

Per ignorare la distinzione di maiuscole e minuscole durante la ricerca, invoca grep con l'opzione -i (o --ignore-case):

grep -i 'fatal\|error\|critical' /var/log/nginx/error.log

Durante la ricerca di una stringa, grep mostrerà tutte le righe in cui la stringa è incorporata in stringhe più grandi. Quindi, se stavi cercando "error", grep stamperà anche le righe in cui "error" è incorporato in parole più grandi, come "errorless" o "antiterrorists".

Per restituire solo quelle righe in cui la stringa specificata è una parola intera (racchiusa da caratteri non parole), utilizzare l'opzione -w (o --word-regexp):

grep -w 'fatal\|error\|critical' /var/log/nginx/error.log

I caratteri di parola includono tutti i simboli alfanumerici (az, AZ e 0-9) e il simbolo sottolineatura _ (underscore). Tutti gli altri simboli sono considerati caratteri non di parole (non-word).

Per maggiori dettagli sulle opzioni grep, visita il nostro articolo comando Grep.

Conclusione

Ti abbiamo mostrato come cercare più pattern, stringhe e parole con grep.