Come escludere pattern, file e directory con grep

Come escludere pattern, file e directory con grep

Dal 1974, il team di Linux grepaiuta le persone a trovare le righe nei file. Ma a volte grepcon troppa attenzione. Ecco alcuni modi per dire di grepignorare cose diverse.

comando grep

Il comando grepricerca nei file di testo le righe che corrispondono ai modelli di ricerca specificati nella riga di comando. Il potere grepsta nell’uso delle espressioni regolari. Ti permettono di descrivere ciò che stai cercando invece di definirlo esplicitamente.

La nascita grepprecede Linux. è stato sviluppato all’inizio degli anni ’70 per Unix. Prende il nome dalla sequenza di tasti g/re/p nell’editor eddi riga (pronunciato “ee-dee” tra l’altro). Ciò significava una ricerca rapida globale e regolare, con la stampa di righe corrispondenti.

grepnoto, forse famigerato, per essere scrupoloso e determinato. A volte cercherà file o directory su cui preferiresti non perdere tempo perché i risultati possono renderti impossibile vedere la foresta per gli alberi.

Naturalmente, ci sono modi per controllare grep. Puoi dirgli di ignorare schemi, file e directory in modo che grep cerchi più velocemente e non sei inondato di falsi positivi senza significato.

Esclusione del modello

Per cercare con, greppuoi indirizzare l’input da qualche altro processo, come cat, oppure puoi specificare un nome file come ultimo argomento della riga di comando.

Stiamo utilizzando un breve file contenente il testo della poesia  Jabberwocky di Lewis Carroll. In questi due esempi, stiamo cercando stringhe che corrispondano al termine di ricerca “jabberwock”.

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

Le righe che contengono corrispondenze con un suggerimento di ricerca sono elencate per noi, con l’elemento corrispondente in ogni riga evidenziato in rosso. Questa è una ricerca diretta. Ma cosa succede se vogliamo escludere le righe contenenti la parola “Jabberwock” e stampare il resto?

Possiamo raggiungere questo obiettivo con l’ -vopzione (inverti corrispondenza). Questo elenca le stringhe che non corrispondono alla query di ricerca.

grep -v "Jabberwock"jabberwocky.text

Le righe che non contengono “Jabmaglot” vengono visualizzate nella finestra del terminale.

Possiamo escludere tutti i termini che desideriamo. Filtra tutte le righe che contengono “Jabberwock” e tutte le righe che contengono “e”. Per questo useremo -eun’opzione (espressione). Dobbiamo usarlo per ogni modello di ricerca che utilizziamo.

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

Una corrispondente diminuzione del numero di righe nell’output.

Se utilizziamo l’ -Eopzione (espressioni regolari estese), possiamo combinare modelli di ricerca con ” |“, che in questo contesto non indica un canale, è un ORoperatore logico.

grep -Ev "Jabberwock|and"jabberwocky.txt

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

Il formato del comando è lo stesso se si desidera utilizzare un modello di espressione regolare anziché un suggerimento di ricerca esplicito. Questo comando escluderà tutte le righe che iniziano con qualsiasi lettera dal set “ACHT”.

grep -Ev "^ACHT"jabberwocky.txt

grepPer vedere le linee che contengono un pattern ma non un altro pattern , possiamo passare grep. Cercheremo tutte le righe che contengono la parola “jabberwock” e quindi filtriamo tutte le righe che contengono anche la parola “ucciso”.

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

Esclusione di file

Possiamo chiedere di grepcercare una stringa o un pattern in un insieme di file. Puoi elencare ogni file sulla riga di comando, ma con molti file questo approccio non è scalabile.

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

Si noti che il nome del file contenente la riga corrispondente appare all’inizio di ogni riga di output.

Per abbreviare l’input, possiamo usare i caratteri jolly. Ma questo può essere controintuitivo. Sembra funzionare.

grep "vorpal"*.txt

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

grep "sword"*.txt

I risultati di cui abbiamo bisogno sono mascherati da un flusso di risultati falsi da altri file TXT.

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

Dobbiamo escludere questi file. Per fare ciò, utilizziamo l’ --excludeopzione. Per escludere un file chiamato “vol-log-1.txt” useremmo questo comando:

grep --exclude=vol-log-1.txt "sword"*.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 "sword"*.txt

Quando utilizziamo l’ -Ropzione (dereference-recursive), grepcercherà per noi tutti gli alberi di directory. Per impostazione predefinita, cercherà tutti i file in queste posizioni. Potrebbero esserci diversi tipi di file che vogliamo escludere.

Nella directory corrente su questa macchina di prova, sono presenti sottodirectory contenenti file di registro, file CSV e file MD. Questi sono tutti i tipi di file di testo che vogliamo escludere. Potremmo usare un --excludeparametro 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, nonché tutti i file .txt i cui nomi iniziano con “vol” o “log”.

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

Directory escluse

Se i file che vogliamo ignorare sono contenuti in directory e quelle directory non contengono i file che vogliamo trovare, possiamo escludere completamente quelle directory.

Il concetto è molto simile all’esclusione dei file, tranne per il fatto che utilizziamo un --exclude-dirparametro e denominiamo le directory da ignorare.

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

Abbiamo escluso la directory “backup”, ma stiamo ancora cercando in un’altra directory denominata “backup2”.

Non sorprende che possiamo usare questa --exclude-diropzione più volte nello stesso comando. Si noti che il percorso delle directory escluse deve essere relativo alla directory in cui inizierà la ricerca. Non utilizzare un percorso assoluto dalla radice del file system.

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

Possiamo anche usare i raggruppamenti. Possiamo ottenere lo stesso risultato in modo più conciso:

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

Puoi combinare esclusioni di file e directory in un unico comando. Se desideri escludere tutti i file da una directory ed escludere determinati tipi di file dalle directory di ricerca, utilizza questa sintassi:

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

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *