Cum să excludeți modele, fișiere și directoare cu grep

Publicat: 2022-06-29
Laptop Linux afișează un prompt bash
fatmawati achmad zaenuri/Shutterstock.com

Din 1974, comanda Linux grep a ajutat oamenii să găsească șiruri în fișiere. Dar uneori grep este pur și simplu prea minuțios. Iată câteva modalități de a-i spune grep să ignore diferite lucruri.

Comanda grep

Comanda grep caută fișiere text căutând șiruri care se potrivesc cu modelele de căutare pe care le furnizați pe linia de comandă. Puterea grep constă în utilizarea expresiilor regulate. Acestea vă permit să descrie ceea ce căutați, mai degrabă decât să trebuiască să îl definiți în mod explicit.

Nașterea grep este anterioară Linuxului. a fost dezvoltat la începutul anilor 1970 pe Unix. Își ia numele de la secvența de taste g/re/p din editorul de linii ed (întâmplător, pronunțat „ee-dee”). Aceasta a reprezentat căutare globală, regulată rapidă, printare linii de potrivire.

grep este celebru - poate, notoriu - minuțios și hotărât. Uneori, va căuta fișiere sau directoare cu care ai prefera să nu-și piardă timpul, deoarece rezultatele te pot face să nu poți vedea lemnul pentru copaci.

Cum să utilizați comanda grep pe Linux
LEGATE Cum să utilizați comanda grep pe Linux

Desigur, există modalități de a regăsi grep. Îi poți spune să ignore modele, fișiere și directoare, astfel încât grep să-și finalizeze căutările mai repede și să nu fii cuprins de false pozitive fără sens.

Excluzând modelele

Pentru a căuta cu grep , puteți trimite intrarea către acesta din alt proces, cum ar fi cat , sau puteți furniza un nume de fișier ca ultimul parametru al liniei de comandă.

Folosim un fișier scurt care conține textul poeziei Jabberwocky , de Lewis Carroll. În aceste două exemple, căutăm linii care se potrivesc cu termenul de căutare „Jabberwock”.

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

Două moduri diferite de a căuta prin același fișier text cu grep

Liniile care conțin potriviri cu indiciul de căutare sunt listate pentru noi, cu elementul care se potrivește din fiecare linie evidențiat cu roșu. Este o căutare simplă. Dar dacă vrem să excludem liniile care conțin cuvântul „Jabberwock” și să tipărim restul?

Putem realiza acest lucru cu opțiunea -v (potrivire inversă). Aceasta listează rândurile care nu se potrivesc cu termenul de căutare.

 grep -v „Jabberwock” jabberwocky.text 

Folosind opțiunea de căutare inversată -v cu grep

Liniile care nu conțin „Jabberwock” sunt listate în fereastra terminalului.

Toate rândurile care nu conțin cuvântul jabberwock

Putem exclude oricât de mulți termeni dorim. Să filtrăm orice rând care conține „Jabberwock” și orice rând care conține „și”. Pentru a realiza acest lucru vom folosi opțiunea -e (expresie). Trebuie să-l folosim pentru fiecare model de căutare pe care îl folosim.

 grep -v -e „Jabberwock” -e „și” jabberwocky.txt 

Utilizarea mai multor clauze de căutare cu grep

Există o scădere corespunzătoare a numărului de linii din ieșire.

Rândurile din text care nu se potrivesc cu niciunul dintre termenii de căutare

Dacă folosim opțiunea -E (extended regexes), putem combina modelele de căutare cu „ | „, care în acest context nu indică o conductă, este operatorul logic OR .

 grep -Ev „Jabberwock|și” jabberwocky.txt 

Folosind operatorul logic OR cu grep

Obținem exact aceeași ieșire ca și cu comanda anterioară, mai lungă.

Rândurile din text care nu se potrivesc cu niciunul dintre termenii de căutare

Formatul comenzii este același dacă doriți să utilizați un model regex în loc de un indiciu de căutare explicit. Această comandă va exclude toate liniile care încep cu orice literă din setul „ACHT”.

 grep -Ev „^ACHT” jabberwocky.txt 

Excluzând fișierele care încep cu anumite litere

Pentru a vedea linii care conțin un model, dar care, de asemenea, nu conțin un alt model, putem introduce grep în grep . Vom căuta toate liniile care conțin cuvântul „Jabberwock” și apoi vom filtra toate rândurile care conțin și cuvântul „ucis”.

 grep „Jabberwock” jabberwocky.txt | grep -v "ucis" 

Introduceți grep în grep pentru a filtra de două ori

Excluderea fișierelor

Putem cere grep să caute un șir sau un model într-o colecție de fișiere. Puteți enumera fiecare fișier pe linia de comandă, dar cu multe fișiere, această abordare nu se scalează.

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

Căutarea într-o listă de fișiere denumite

Rețineți că numele fișierului care conține linia potrivită este afișat la începutul fiecărei linii de ieșire.

Pentru a reduce tastarea, putem folosi metacaracterele. Dar asta poate fi contraintuitiv. Acest lucru pare să funcționeze.

 grep "vorpal" *.txt 

Utilizarea metacaractere pentru a căuta o colecție de fișiere

Cu toate acestea, în acest director există și alte fișiere TXT, fără nicio legătură cu poemul. Dacă căutăm cuvântul „sabie” cu aceeași structură de comandă, obținem o mulțime de rezultate false pozitive.

 grep „sabie” *.txt 

Căutarea „sabie” printr-o colecție de fișiere TXT

Rezultatele pe care le dorim sunt mascate de potopul de rezultate false din celelalte fișiere care au extensia TXT.

Un set mare de rezultate false pozitive

Cuvântul „vorpal” nu se potrivește cu nimic, dar „sword” este inclus în cuvântul „parolă”, așa că a fost găsit de multe ori în unele pseudo-fișiere jurnal.

Trebuie să excludem aceste fișiere. Pentru a face asta, vom folosi opțiunea --exclude . Pentru a exclude un singur fișier numit „vol-log-1.txt” am folosi această comandă:

 grep --exclude=vol-log-1.txt „sabie” *.txt

În acest caz, dorim să excludem mai multe fișiere jurnal cu nume care încep cu „vol.” Sintaxa de care avem nevoie este:

 grep --exclude=vol*.txt „sabie” *.txt 

Excluderea fișierelor cu metacaractere

Când folosim opțiunea -R (dereference-recursive) grep va căuta în întregi arbori de directoare pentru noi. În mod implicit, va căuta prin toate fișierele din acele locații. Este posibil să existe mai multe tipuri de fișiere pe care dorim să le excludem.

Sub directorul curent de pe această mașină de testare, există directoare imbricate care conțin fișiere jurnal, fișiere CSV și fișiere MD. Acestea sunt toate tipurile de fișiere text pe care dorim să le excludem. Am putea folosi o opțiune --exclude pentru fiecare tip de fișier, dar putem realiza ceea ce ne dorim mai eficient prin gruparea tipurilor de fișiere.

Această comandă exclude toate fișierele care au extensii CSV sau MD și toate fișierele TXT ale căror nume încep fie cu „vol” fie „log”.

 grep -R --exclude=*.{csv,md} --exclude={vol*,log*}.txt „sabie” /home/dave/data/ 

Folosind mai multe clauze --exclude și grupări de nume de fișiere

Cu excepția directoarelor

Dacă fișierele pe care dorim să le ignorăm sunt conținute în directoare și nu există fișiere în acele directoare pe care dorim să le căutăm, putem exclude acele directoare întregi.

Conceptul este foarte asemănător cu cel de excludere a fișierelor, cu excepția faptului că folosim opțiunea --exclude-dir și numim directoarele de ignorat.

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

Excluderea unui director din căutare

Am exclus directorul „backup”, dar încă căutăm prin alt director numit „backup2”.

Nu va fi o surpriză că putem folosi opțiunea --exclude-dir mai multe ori într-o singură comandă. Rețineți că calea către directoarele excluse ar trebui să fie dată în raport cu directorul în care va începe căutarea. Nu utilizați calea absolută de la rădăcina sistemului de fișiere.

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

Excluzând două directoare din căutare

Putem folosi și grupări. Același lucru îl putem realiza mai succint cu:

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

Excluzând directoarele cu grupare

Puteți combina excluderile de fișiere și directoare în aceeași comandă. Dacă doriți să excludeți toate fișierele dintr-un director și să excludeți anumite tipuri de fișiere din directoarele căutate, utilizați această sintaxă:

 grep -R --exclude=*.{csv,md} --exclude-dir=backup/arhivă „frumious” /home/dave/data 

Excluderea tipurilor de fișiere și a directoarelor din aceeași comandă

Uneori este ceea ce lași afară

Uneori, cu grep , se poate simți ca și cum ai încerca să găsești un ac într-un car de fân. face o mare diferență să scoți carul de fân.

LEGATE: Cum să utilizați expresiile regulate (regexes) pe Linux