grep
è un potente strumento da 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 ciascuna riga corrispondente nell'output standard.
In questo articolo, ti mostreremo come escludere una o più parole, schemi o directory durante la ricerca con grep
.
Escludi parole e schemi #
Per visualizzare solo le righe che non corrispondono a un modello di ricerca, utilizzare il -v
( o --invert-match
) opzione.
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
linuxize:x:1000:1000:linuxize:/home/linuxize:/bin/bash
Il -w
l'opzione dice a grep
per restituire solo quelle righe in cui la stringa specificata è una parola intera (racchiusa da caratteri non di parola).
Per impostazione predefinita, grep
fa distinzione tra maiuscole e minuscole. Ciò significa che i caratteri maiuscoli e minuscoli vengono trattati come distinti. Per ignorare il caso durante la ricerca, invoca grep
con il -i
opzione.
Se la stringa di ricerca include spazi, è necessario racchiuderla tra virgolette singole o doppie.
Per specificare due o più modelli di ricerca, utilizzare il -e
opzione:
grep -wv -e nologin -e bash /etc/passwd
Puoi usare il -e
opzione tutte le volte che vuoi.
Un'altra opzione per escludere più modelli di ricerca consiste nell'unire i modelli utilizzando l'operatore OR |
.
L'esempio seguente stampa le righe che non contengono le stringhe nologin
o bash
:
grep -wv 'nologin\|bash' /etc/passwd
GNU grep
supporta tre sintassi di espressioni regolari, Basic, Extended e compatibile con Perl. Per impostazione predefinita, grep
interpreta il modello come un'espressione regolare di base in cui i metacaratteri come |
perdono il loro significato speciale e devi usare le loro versioni con barra rovesciata.
Se utilizzi l'opzione di espressione regolare estesa -E
, quindi l'operatore |
non deve essere evitato, 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, le righe in cui la stringa games
si verificano all'inizio di una riga sono esclusi:
grep -v "^games" file.txt
L'output di un comando può essere filtrato con grep
attraverso le tubazioni e sul terminale verranno stampate solo le linee che corrispondono a un determinato motivo.
Ad esempio, per stampare tutti i processi in esecuzione sul tuo sistema eccetto quelli in esecuzione come utente "root" puoi filtrare l'output di ps
comando:
ps -ef | grep -wv root
Escludi directory e file #
A volte quando si esegue una ricerca ricorsiva con -r
o -R
opzioni, potresti voler escludere directory specifiche dal risultato della ricerca.
-r
o -R
opzioni è che quando grep viene invocato con R
maiuscolo seguirà tutti i collegamenti simbolici
Per escludere una directory dalla ricerca, usa --exclude-dir
opzione. Il percorso della directory esclusa è relativo alla directory di ricerca.
Ecco un esempio che mostra come cercare la stringa linuxize
in tutti i file all'interno di /etc
, escluso il /etc/pki
directory:
grep -R --exclude-dir=pki linuxize /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 tuo sistema Linux escludendo il proc
, boot
e sys
directory che eseguiresti:
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 in --exclude
opzione.
Nell'esempio seguente, stiamo cercando in tutti i file nella directory di lavoro corrente la stringa linuxize
, esclusi i file che terminano con .png
e .jpg
directory:
grep -rl --exclude=*.{png,jpg} linuxize *
Conclusione #
Il grep
Il comando consente di escludere pattern e directory durante la ricerca di file.