Come escludere pattern, file e directory con grep
Dal 1974, il team di Linux grep
aiuta le persone a trovare le righe nei file. Ma a volte grep
con troppa attenzione. Ecco alcuni modi per dire di grep
ignorare cose diverse.
comando grep
Il comando grep
ricerca nei file di testo le righe che corrispondono ai modelli di ricerca specificati nella riga di comando. Il potere grep
sta nell’uso delle espressioni regolari. Ti permettono di descrivere ciò che stai cercando invece di definirlo esplicitamente.
La nascita grep
precede Linux. è stato sviluppato all’inizio degli anni ’70 per Unix. Prende il nome dalla sequenza di tasti g/re/p nell’editor ed
di riga (pronunciato “ee-dee” tra l’altro). Ciò significava una ricerca rapida globale e regolare, con la stampa di righe corrispondenti.
grep
noto, 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, grep
puoi 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’ -v
opzione (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 -e
un’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’ -E
opzione (espressioni regolari estese), possiamo combinare modelli di ricerca con ” |
“, che in questo contesto non indica un canale, è un OR
operatore 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
grep
Per 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 grep
cercare 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’ --exclude
opzione. 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’ -R
opzione (dereference-recursive), grep
cercherà 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 --exclude
parametro 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-dir
parametro 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-dir
opzione 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