Introduzione
grep
è un potente strumento della riga di comando che viene utilizzato per cercare in uno o più file di input le righe che corrispondono a un'espressione regolare e scrive ogni riga corrispondente nell'output standard.
In questo articolo, ti mostreremo come escludere una o più parole, schemi o directory durante la ricerca con grep
.
Escludere parole e schemi
Per visualizzare solo le righe che non corrispondono a un modello di ricerca, utilizzare l'opzione -v
(o --invert-match
).
Ad esempio, per stampare le righe che non contengono la stringa nologin
useresti:
grep -wv nologin /etc/passwd
root:x:0:0:root:/root:/bin/bash
git:x:994:994:git daemon user:/:/usr/bin/git-shell
noviello:x:1000:1000:noviello:/home/noviello:/bin/bash
L'opzione -w
permette a grep
di restituire solo quelle righe in cui la stringa specificata è una parola intera (racchiusa da caratteri non alfanumerici).
Per impostazione predefinita, grep
fa distinzione tra maiuscole e minuscole. Ciò significa che i caratteri maiuscoli e minuscoli vengono trattati come distinti. Per ignorare le maiuscole/minuscole durante la ricerca, invocare grep
con l'opzione -i
.
Se la stringa di ricerca include spazi, è necessario racchiuderla tra virgolette singole o doppie.
Per specificare due o più modelli di ricerca, utilizza l'opzione -e
:
grep -wv -e nologin -e bash /etc/passwd
Puoi utilizzare l'opzione -e
tutte le volte che desideri.
Un'altra opzione per escludere più pattern di ricerca consiste nell'unire i pattern utilizzando l'operatore OR |
.
L'esempio seguente stampa le righe che non contengono le stringhe nologin
oppure bash
:
grep -wv 'nologin\|bash' /etc/passwd
GNU grep
supporta tre sintassi di espressioni regolari, Basic, Extended e Perl-compatibile. Per impostazione predefinita, grep
interpreta il modello come un'espressione regolare di base in cui i metacaratteri |
perdono il loro significato speciale e devi utilizzare le loro versioni con barra rovesciata.
Se utilizzi l'opzione di espressione regolare estesa -E
, non è necessario eseguire l'escape dell'operatore |
, come mostrato di seguito:
grep -Ewv 'nologin|bash' /etc/passwd
È possibile specificare diverse possibili corrispondenze che possono essere stringhe letterali o set di espressioni. Nell'esempio seguente, vengono escluse le righe games
in cui la stringa si trova all'inizio di una riga:
grep -v "^games" file.txt
L'output di un comando può essere filtrato con grep
tramite piping e sul terminale verranno stampate solo le righe che corrispondono a un determinato modello.
Ad esempio, per stampare tutti i processi in esecuzione sul tuo sistema eccetto quelli in esecuzione come utente "root" puoi filtrare l'output del comando ps
:
ps -ef | grep -wv root
Escludere directory e file
A volte, quando si esegue una ricerca ricorsiva con le opzioni -r
o -R
, è possibile escludere directory specifiche dal risultato della ricerca.
La principale differenza tra le opzioni -r
o -R
è che quando grep viene invocato con le maiuscole R
seguirà tutti i collegamenti simbolici.
Per escludere una directory dalla ricerca, utilizzare l'opzione --exclude-dir
. Il percorso della directory esclusa è relativo alla directory di ricerca.
Ecco un esempio che mostra come cercare la stringa noviello
in tutti i file all'interno di /etc
, esclusa la directory /etc/pki
:
grep -R --exclude-dir=pki noviello /etc
Per escludere più directory, racchiudere le directory escluse tra parentesi graffe e separarle con virgole senza spazi.
Ad esempio, per trovare i file che contengono la stringa 'GNU' nel vostro sistema Linux escluso le directory proc
, boot
e sys
si correrebbe:
grep -r --exclude-dir={proc,boot,sys} gnu /
Quando si utilizza la corrispondenza con caratteri jolly, è possibile escludere i file il cui nome di base corrisponde al GLOB specificato nell'opzione --exclude
.
Nell'esempio seguente, stiamo cercando la stringa in tutti i file nella directory di lavoro corrente noviello
, esclusi i file che terminano con .png
e .jpg
:
grep -rl --exclude=*.{png,jpg} noviello *
Conclusione
Il comando grep
consente di escludere modelli e directory durante la ricerca di file.