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
.