Si të përjashtoni modelet, skedarët dhe drejtoritë me grep


Që nga viti 1974, komanda Linux grep ka ndihmuar njerëzit të gjejnë vargje në skedarë. Por ndonjëherë grep është shumë i plotë. Këtu janë disa mënyra për t'i thënë grep të injorojë gjëra të ndryshme.

Komanda grep

Komanda grep kërkon skedarë teksti duke kërkuar vargje që përputhen me modelet e kërkimit që jepni në vijën e komandës. Fuqia e grep qëndron në përdorimin e shprehjeve të rregullta. Këto ju lejojnë të përshkruani atë që po kërkoni, në vend që të duhet ta përcaktoni në mënyrë eksplicite.

Lindja e grep daton para Linux-it. ajo u zhvillua në fillim të viteve 1970 në Unix. Ai e merr emrin nga sekuenca kryesore g/re/p në redaktorin e linjës ed (rastësisht shqiptohet ee-dee). Kjo do të thoshte global, rekërkim i rregullt ekspres, ppërputhja e rreshtave.

grep është e famshme—ndoshta, në mënyrë famëkeqe—të plotë dhe me mendje të vetme. Ndonjëherë do të kërkojë skedarë ose direktori ku do të preferonit të mos humbiste kohën e vet, sepse rezultatet mund t'ju lënë të paaftë për të parë drurin për pemët.

Natyrisht, ka mënyra për të sunduar grep-in. Mund t'i thuash që të injorojë modelet, skedarët dhe drejtoritë në mënyrë që grep t'i kryejë kërkimet e tij më shpejt dhe të mos mbytesh me false pozitive të pakuptimta.

Duke përjashtuar modelet

Për të kërkuar me grep, mund të dërgoni hyrjen në të nga ndonjë proces tjetër si cat , ose mund të jepni një emër skedari si parametrin e fundit të linjës së komandës.

Po përdorim një skedar të shkurtër që përmban tekstin e poemës Jabberwocky, nga Lewis Carroll. Në këta dy shembuj, ne jemi duke kërkuar për rreshta që përputhen me termin e kërkimit Jabberwock.

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

Linjat që përmbajnë përputhje me çelësin e kërkimit janë të listuara për ne, me elementin që përputhet në secilën rresht të theksuar me të kuqe. Ky është një kërkim i drejtpërdrejtë. Por, çka nëse duam të përjashtojmë rreshtat që përmbajnë fjalën Jabberwock dhe të shtypim pjesën tjetër?

Këtë mund ta arrijmë me opsionin -v (përputhja e përmbysur). Kjo rendit rreshtat që nuk përputhen me termin e kërkimit.

grep -v "Jabberwock" jabberwocky.text

Linjat që nuk përmbajnë Jabberwock renditen në dritaren e terminalit.

Mund të përjashtojmë sa më shumë terma të dëshirojmë. Le të filtrojmë çdo rresht që përmban Jabberwock dhe çdo rresht që përmban dhe. Për ta arritur këtë ne do të përdorim opsionin -e (shprehje). Ne duhet ta përdorim atë për çdo model kërkimi që po përdorim.

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

Ka një rënie përkatëse në numrin e linjave në dalje.

Nëse përdorim opsionin -E (regexes të zgjeruara), ne mund të kombinojmë modelet e kërkimit me |, e cila në këtë kontekst nuk tregon një tub, është operatori logjik OR.

grep -Ev "Jabberwock|and" jabberwocky.txt

Ne marrim saktësisht të njëjtin rezultat si me komandën e mëparshme, me erë më të gjatë.

Formati i komandës është i njëjtë nëse dëshironi të përdorni një model regex në vend të një çelësi të qartë kërkimi. Kjo komandë do të përjashtojë të gjitha linjat që fillojnë me ndonjë shkronjë në grupin e ACHT.

grep -Ev "^ACHT" jabberwocky.txt

Për të parë linjat që përmbajnë një model, por që gjithashtu nuk përmbajnë një model tjetër, ne mund të futim grepgrep. Ne do të kërkojmë për të gjitha rreshtat që përmbajnë fjalën Jabberwock dhe më pas do të filtrojmë çdo rresht që gjithashtu përmbajë fjalën të vrarë.

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

Duke përjashtuar skedarët

Mund t'i kërkojmë grep të kërkojë një varg ose model në një koleksion skedarësh. Ju mund të rendisni çdo skedar në vijën e komandës, por me shumë skedarë kjo qasje nuk shkallëzohet.

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

Vini re se emri i skedarit që përmban rreshtin që përputhet shfaqet në fillim të çdo rreshti të prodhimit.

Për të reduktuar shtypjen, mund të përdorim shkronja të ngurta. Por kjo mund të jetë kundërintuitive. Kjo duket se funksionon.

grep "vorpal" *.txt

Megjithatë, në këtë direktori ka skedarë të tjerë TXT, pa asnjë lidhje me poezinë. Nëse kërkojmë fjalën shpatë me të njëjtën strukturë komanduese, marrim shumë rezultate false.

grep "sword" *.txt

Rezultatet që duam maskohen nga përmbytja e rezultateve të rreme nga skedarët e tjerë që kanë shtrirjen TXT.

Fjala vorpal nuk përputhej me asgjë, por shpata është përfshirë në fjalën fjalëkalim kështu që është gjetur shumë herë në disa pseudo-skedarë.

Ne duhet t'i përjashtojmë këto skedarë. Për ta bërë këtë, ne do të përdorim opsionin --exclude. Për të përjashtuar një skedar të vetëm të quajtur vol-log-1.txt, ne do të përdornim këtë komandë:

grep --exclude=vol-log-1.txt "sword" *.txt

Në këtë rast, ne duam të përjashtojmë skedarë të shumtë të regjistrave me emra që fillojnë me vol. Sintaksa që na nevojitet është:

grep --exclude=vol*.txt "sword" *.txt

Kur përdorim opsionin -R (dereference-rekursive) grep do të kërkojë të gjithë pemët e drejtorisë për ne. Si parazgjedhje, ai do të kërkojë nëpër të gjithë skedarët në ato vende. Mund të ketë shumë lloje skedarësh që dëshirojmë të përjashtojmë.

Nën drejtorinë aktuale në këtë makinë testuese, ka direktori të ndërlidhura që përmbajnë skedarë ditarësh, skedarë CSV dhe skedarë MD. Këto janë të gjitha llojet e skedarëve tekst që duam t'i përjashtojmë. Mund të përdorim një opsion --exclude për çdo lloj skedari, por mund të arrijmë atë që duam në mënyrë më efikase duke grupuar llojet e skedarëve.

Kjo komandë përjashton të gjithë skedarët që kanë shtesa CSV ose MD, dhe të gjithë skedarët TXT, emrat e të cilëve fillojnë me vol ose log.

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

Duke përjashtuar drejtoritë

Nëse skedarët që duam të shpërfillim gjenden në drejtori dhe nuk ka skedarë në ato drejtori që duam të kërkojmë, mund t'i përjashtojmë të gjitha ato drejtori.

Koncepti është shumë i ngjashëm me atë të përjashtimit të skedarëve, përveçse ne përdorim opsionin --exclude-dir dhe emërtojmë drejtoritë që duhen injoruar.

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

Ne e kemi përjashtuar direktorinë backup, por jemi ende duke kërkuar përmes një drejtorie tjetër të quajtur backup2.

Nuk do të jetë befasi që ne mund të përdorim opsionin --exclude-dir shumë herë në një komandë të vetme. Vini re se shtegu drejt drejtorive të përjashtuara duhet të jepet në lidhje me drejtorinë ku do të fillojë kërkimi. Mos përdorni shtegun absolut nga rrënja e sistemit të skedarëve.

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

Mund të përdorim edhe grupime. Të njëjtën gjë mund ta arrijmë më shkurt me:

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

Ju mund të kombinoni përjashtimet e skedarëve dhe drejtorive në të njëjtën komandë. Nëse dëshironi të përjashtoni të gjithë skedarët nga një drejtori dhe të përjashtoni disa lloje skedarësh nga drejtoritë që janë të kërkuara, përdorni këtë sintaksë:

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

Ndonjëherë është ajo që ju lini jashtë

Ndonjëherë me grep mund të duket sikur po përpiqeni të gjeni një gjilpërë në një kashtë. bën dallim të madh heqja e kashtës.