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 grep
në grep
. 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.