Cum să excludeți modele, fișiere și directoare cu grep
Publicat: 2022-06-29 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.
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
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
Liniile care nu conțin „Jabberwock” sunt listate în fereastra terminalului.
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
Există o scădere corespunzătoare a numărului de linii din ieșire.
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
Obținem exact aceeași ieșire ca și cu comanda anterioară, mai lungă.
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
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"
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
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
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
Rezultatele pe care le dorim sunt mascate de potopul de rezultate false din celelalte fișiere care au extensia TXT.
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
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/
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
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
Putem folosi și grupări. Același lucru îl putem realiza mai succint cu:
grep -R --exclude-dir={backup,backup2} "vorpal" /home/dave/data
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
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