Come escludere pattern, file e directory con grep

Pubblicato: 2022-06-29
Laptop Linux che mostra un prompt bash
fatmawati achmad zaenuri/Shutterstock.com

Dal 1974, il comando Linux grep aiuta le persone a trovare le stringhe nei file. Ma a volte grep è troppo completo. Ecco diversi modi per dire a grep di ignorare cose diverse.

Il comando grep

Il comando grep ricerca i file di testo alla ricerca di stringhe che corrispondono ai modelli di ricerca forniti nella riga di comando. Il potere di grep sta nel suo uso di espressioni regolari. Questi ti consentono di descrivere ciò che stai cercando, piuttosto che doverlo definire esplicitamente.

La nascita di grep precede Linux. è stato sviluppato nei primi anni '70 su Unix. Prende il nome dalla sequenza di tasti g/re/p nell'editor di linee ed (per inciso, pronunciato "ee-dee"). Stava per ricerca rapida globale, regolare , stampa di righe di corrispondenza.

grep è notoriamente, forse notoriamente, completo e determinato. A volte cercherà file o directory in cui preferiresti non sprecare tempo, perché i risultati possono lasciarti incapace di vedere il legno per gli alberi.

Come usare il comando grep su Linux
CORRELATI Come utilizzare il comando grep su Linux

Naturalmente, ci sono modi per regnare su grep. Puoi dirgli di ignorare pattern, file e directory in modo che grep completi le sue ricerche più velocemente e non sei sommerso da falsi positivi senza senso.

Esclusi i modelli

Per cercare con grep puoi inviare tramite pipe l'input da qualche altro processo come cat , oppure puoi fornire un nome file come ultimo parametro della riga di comando.

Stiamo utilizzando un breve file che contiene il testo della poesia Jabberwocky , di Lewis Carroll. In questi due esempi, stiamo cercando righe che corrispondono al termine di ricerca "Jabberwock".

 gatto jabberwocky.txt | grep "Jabberwock"
 grep "Jabberwock" jabberwocky.text 

Due modi diversi per cercare nello stesso file di testo con grep

Le righe che contengono corrispondenze all'indizio di ricerca sono elencate per noi, con l'elemento corrispondente in ogni riga evidenziato in rosso. Questa è una ricerca semplice. Ma cosa succede se vogliamo escludere le righe che contengono la parola "Jabberwock" e stampare il resto?

Possiamo farlo con l'opzione -v (inverti corrispondenza). Questo elenca le righe che non corrispondono al termine di ricerca.

 grep -v "Jabberwock" jabberwocky.text 

Usando l'opzione di ricerca invertita -v con grep

Le righe che non contengono "Jabberwock" sono elencate nella finestra del terminale.

Tutte le righe che non contengono la parola jabberwock

Possiamo escludere tutti i termini che desideriamo. Filtra tutte le righe che contengono "Jabberwock" e tutte le righe che contengono "e". Per ottenere ciò utilizzeremo l'opzione -e (espressione). Dobbiamo usarlo per ogni modello di ricerca che stiamo usando.

 grep -v -e "Jabberwock" -e "e" jabberwocky.txt 

Utilizzo di più clausole di ricerca con grep

C'è un corrispondente calo nel numero di righe nell'output.

Le righe del testo che non corrispondono a nessuno dei termini di ricerca

Se utilizziamo l'opzione -E (regex estese), possiamo combinare i modelli di ricerca con “ | “, che in questo contesto non indica una pipe, è l'operatore logico OR .

 grep -Ev "Jabberwock|e" jabberwocky.txt 

Utilizzando l'operatore logico OR con grep

Otteniamo esattamente lo stesso output del precedente comando più prolisso.

Le righe del testo che non corrispondono a nessuno dei termini di ricerca

Il formato del comando è lo stesso se si desidera utilizzare un modello regex invece di un indizio di ricerca esplicito. Questo comando escluderà tutte le righe che iniziano con qualsiasi lettera nell'insieme di "ACHT".

 grep -Ev "^ACHT" jabberwocky.txt 

Esclusi i file che iniziano con lettere particolari

Per vedere le righe che contengono un pattern ma che non contengono anche un altro pattern, possiamo pipe grep in grep . Cercheremo tutte le righe che contengono la parola "Jabberwock" e quindi filtriamo tutte le righe che contengono anche la parola "slain".

 grep "Jabberwock" jabberwocky.txt | grep -v "ucciso" 

Piping grep in grep per filtrare due volte

File esclusi

Possiamo chiedere a grep di cercare una stringa o un pattern in una raccolta di file. Puoi elencare ogni file sulla riga di comando, ma con molti file che si avvicinano non si ridimensiona.

 grep "vorpal" versetto-1.txt versetto-2.txt versetto-3.txt versetto-4.txt versetto-5.txt versetto-6.txt 

Ricerca in un elenco di file denominati

Si noti che il nome del file contenente la riga corrispondente viene visualizzato all'inizio di ogni riga di output.

Per ridurre la digitazione possiamo usare i caratteri jolly. Ma questo può essere controintuitivo. Questo sembra funzionare.

 grep "vorpal" *.txt 

Utilizzo di caratteri jolly per cercare una raccolta di file

Tuttavia, in questa directory ci sono altri file TXT, che non hanno nulla a che fare con la poesia. Se cerchiamo la parola "spada" con la stessa struttura di comando, otteniamo molti falsi positivi.

 grep "spada" *.txt 

Ricerca di "spada" attraverso una raccolta di file TXT

I risultati che vogliamo sono mascherati dal diluvio di falsi risultati degli altri file che hanno l'estensione TXT.

Un ampio insieme di risultati di falsi positivi

La parola “vorpal” non corrispondeva a nulla, ma “spada” è inclusa nella parola “password” quindi è stata trovata molte volte in alcuni pseudo-file di log.

Dobbiamo escludere questi file. Per farlo useremo l'opzione --exclude . Per escludere un singolo file chiamato “vol-log-1.txt” useremmo questo comando:

 grep --exclude=vol-log-1.txt "spada" *.txt

In questo caso, vogliamo escludere più file di registro con nomi che iniziano con "vol". La sintassi di cui abbiamo bisogno è:

 grep --exclude=vol*.txt "spada" *.txt 

Esclusi file con caratteri jolly

Quando usiamo l'opzione -R (dereference-recursive) grep cercherà per noi interi alberi di directory. Per impostazione predefinita, cercherà in tutti i file in quelle posizioni. Potrebbero esserci più tipi di file che desideriamo escludere.

Sotto la directory corrente su questa macchina di prova, ci sono directory nidificate contenenti file di registro, file CSV e file MD. Questi sono tutti i tipi di file di testo che vogliamo escludere. Potremmo usare un'opzione --exclude per ogni tipo di file, ma possiamo ottenere ciò che vogliamo in modo più efficiente raggruppando i tipi di file.

Questo comando esclude tutti i file con estensione CSV o MD e tutti i file TXT i cui nomi iniziano con "vol" o "log".

 grep -R --exclude=*.{csv,md} --exclude={vol*,log*}.txt "spada" /home/dave/data/ 

Utilizzo di più clausole --exclude e raggruppamenti di nomi di file

Directory escluse

Se i file che vogliamo ignorare sono contenuti in directory e non ci sono file in quelle directory che vogliamo cercare, possiamo escludere quelle intere directory.

Il concetto è molto simile a quello di esclusione dei file, tranne per il fatto che utilizziamo l'opzione --exclude-dir e denominiamo le directory da ignorare.

 grep -R --exclude-dir=backup "vorpal" /home/dave/data 

Esclusione di una directory dalla ricerca

Abbiamo escluso la directory "backup", ma stiamo ancora cercando in un'altra directory chiamata "backup2".

Non sorprende che possiamo usare l'opzione --exclude-dir più volte in un unico comando. Si noti che il percorso delle directory escluse deve essere fornito rispetto alla directory in cui inizierà la ricerca. Non utilizzare il percorso assoluto dalla radice del file system.

 grep -R --exclude-dir=backup --exclude-dir=backup2 "vorpal" /home/dave/data 

Esclusione di due directory dalla ricerca

Possiamo usare anche i raggruppamenti. Possiamo ottenere la stessa cosa in modo più conciso con:

 grep -R --exclude-dir={backup,backup2} "vorpal" /home/dave/data 

Escluse directory con raggruppamento

È possibile combinare le esclusioni di file e directory nello stesso comando. Se si desidera escludere tutti i file da una directory ed escludere determinati tipi di file dalle directory cercate, utilizzare questa sintassi:

 grep -R --exclude=*.{csv,md} --exclude-dir=backup/archive "frumious" /home/dave/data 

Esclusione di tipi di file e directory nello stesso comando

A volte è ciò che si tralascia

A volte con grep può sembrare di cercare un ago in un pagliaio. fa una grande differenza rimuovere il pagliaio.

CORRELATI: Come utilizzare le espressioni regolari (regex) su Linux