Come escludere pattern, file e directory con grep
Pubblicato: 2022-06-29
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.
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
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
Le righe che non contengono "Jabberwock" sono elencate 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 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
C'è un corrispondente calo nel numero di righe nell'output.
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
Otteniamo esattamente lo stesso output del precedente comando più prolisso.
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
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"

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
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
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
I risultati che vogliamo sono mascherati dal diluvio di falsi risultati degli altri file che hanno l'estensione TXT.
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
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/
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
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
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
È 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
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