Како да се исклучат шаблони, датотеки и директориуми со grep
Од 1974 година, командата grep
на Linux им помага на луѓето да најдат низи во датотеките. Но, понекогаш grep
е премногу темелен. Еве неколку начини да му кажете на grep
да игнорира различни работи.
Командата grep
Командата grep
пребарува текстуални датотеки барајќи низи што одговараат на шемите за пребарување што ги давате на командната линија. Моќта на grep
лежи во неговата употреба на регуларни изрази. Овие ви дозволуваат да опишете што барате, наместо да треба експлицитно да го дефинирате.
Раѓањето на grep
датира пред Linux. тој беше развиен во раните 1970-ти на Unix. Го зема своето име од секвенцата на копчињата g/re/p во уредувачот на линијата ed
(патем, се изговара „ee-dee“). Ова значеше gлобално, рередовно експресно пребарување, pотпечатете линии што се совпаѓаат.
grep
е славно - можеби, озлогласено - темелно и едноумно. Понекогаш ќе пребарува датотеки или директориуми на кои повеќе би сакале да не го губи времето, бидејќи резултатите може да ве остават да не можете да го видите дрвото за дрвјата.
Се разбира, постојат начини да се владее со grep. Можете да му кажете да ги игнорира шемите, датотеките и директориумите за grep да ги заврши своите пребарувања побрзо и да не бидете преплавени со бесмислени лажни позитиви.
Со исклучок на Шаблони
За да пребарувате со grep
, можете да внесете внес од некој друг процес како што е cat
, или можете да наведете име на датотека како последен параметар на командната линија.
Користиме кратка датотека што го содржи текстот на песната Jabberwocky, од Луис Керол. Во овие два примери, бараме линии што одговараат на терминот за пребарување „Jabberwock“.
cat jabberwocky.txt | grep "Jabberwock"
grep "Jabberwock" jabberwocky.text
Линиите што содржат совпаѓања со поимот за пребарување се наведени за нас, при што елементот за појавување во секоја линија е означен со црвено. Тоа е едноставно пребарување. Но, што ако сакаме да ги исклучиме линиите што го содржат зборот „Jabberwock“ и да ги испечатиме останатите?
Можеме да го постигнеме тоа со опцијата -v
(инвертирано совпаѓање). Ова ги наведува линиите што не се совпаѓаат со терминот за пребарување.
grep -v "Jabberwock" jabberwocky.text
Линиите што не содржат „Jabberwock“ се наведени во терминалниот прозорец.
Можеме да исклучиме онолку термини колку што сакаме. Ајде да ги филтрираме сите линии што содржат „Jabberwock“ и сите линии што содржат „и“. За да го постигнеме ова, ќе ја користиме опцијата -e
(израз). Треба да го користиме за секоја шема за пребарување што ја користиме.
grep -v -e "Jabberwock" -e "and" jabberwocky.txt
Има соодветен пад на бројот на линии во излезот.
Ако ја користиме опцијата -E
(проширени регекси), можеме да ги комбинираме шемите за пребарување со „|
“, што во овој контекст не означува цевка, тоа е логичен оператор ИЛИ
.
grep -Ev "Jabberwock|and" jabberwocky.txt
Го добиваме истиот излез како и со претходната, подолготрајна команда.
Форматот на командата е ист ако сакате да користите регекс шема наместо експлицитна трага за пребарување. Оваа команда ќе ги исклучи сите линии што почнуваат со која било буква во множеството „ACHT“.
grep -Ev "^ACHT" jabberwocky.txt
За да видиме линии кои содржат шема, но кои исто така не содржат друга шема, можеме да внесеме grep
во grep
. Ќе ги бараме сите редови што го содржат зборот „Jabberwock“, а потоа ќе ги филтрираме сите линии што исто така го содржат зборот „убиен“.
grep "Jabberwock" jabberwocky.txt | grep -v "slain"
Со исклучок на датотеки
Можеме да побараме од grep
да бара низа или шема во збирка датотеки. Може да ја наведете секоја датотека на командната линија, но кај многу датотеки тој пристап не се зголемува.
grep "vorpal" verse-1.txt verse-2.txt verse-3.txt verse-4.txt verse-5.txt verse-6.txt
Забележете дека името на датотеката што ја содржи соодветната линија се прикажува на почетокот на секоја излезна линија.
За да го намалиме пишувањето, можеме да користиме џокери. Но, тоа може да биде контраинтуитивно. Се чини дека ова функционира.
grep "vorpal" *.txt
Меѓутоа, во овој директориум има и други TXT датотеки, без никаква врска со песната. Ако го бараме зборот „меч“ со истата командна структура, добиваме многу лажни позитиви.
grep "sword" *.txt
Резултатите што ги сакаме се маскирани со напливот на лажни резултати од другите датотеки што имаат наставка TXT.
Зборот „ворпал“ не се совпаѓаше со ништо, но „меч“ е вклучен во зборот „лозинка“, така што беше пронајден многу пати во некои псевдо-лог-датотеки.
Треба да ги исклучиме овие датотеки. За да го направиме тоа, ќе ја користиме опцијата --exclude
. За да исклучиме една датотека наречена „vol-log-1.txt“, ќе ја користиме оваа команда:
grep --exclude=vol-log-1.txt "sword" *.txt
Во овој пример, сакаме да исклучиме повеќе датотеки за евиденција со имиња што започнуваат со „вол“. Синтаксата што ни треба е:
grep --exclude=vol*.txt "sword" *.txt
Кога ја користиме -R
(dereference-recursive) опцијата grep
ќе бара цели стебла на директориуми за нас. Стандардно, ќе пребарува низ сите датотеки на тие локации. Може да има повеќе типови датотеки што сакаме да ги исклучиме.
Под тековниот директориум на оваа машина за тестирање, има вгнездени директориуми што содржат лог-датотеки, CSV-датотеки и MD-датотеки. Ова се сите видови текстуални датотеки што сакаме да ги исклучиме. Можеме да користиме опција --exclude
за секој тип на датотека, но можеме да го постигнеме она што го сакаме поефикасно со групирање на типовите на датотеки.
Оваа команда ги исклучува сите датотеки што имаат CSV или MD екстензии и сите TXT-датотеки чии имиња започнуваат или со „vol“ или „log“.
grep -R --exclude=*.{csv,md} --exclude={vol*,log*}.txt "sword" /home/dave/data/
Со исклучок на Директориуми
Ако датотеките што сакаме да ги игнорираме се содржани во директориуми и нема датотеки во тие директориуми што сакаме да ги пребаруваме, можеме да ги исклучиме сите тие директориуми.
Концептот е многу сличен на оној за исклучување на датотеки, освен што ја користиме опцијата --exclude-dir
и ги именуваме директориумите што треба да се игнорираат.
grep -R --exclude-dir=backup "vorpal" /home/dave/data
Го исклучивме директориумот „резервна копија“, но сè уште бараме низ друг директориум наречен „резервна копија2“.
Нема да биде изненадување што можеме да ја користиме опцијата --exclude-dir
повеќе пати во една команда. Забележете дека патеката до исклучените директориуми треба да се даде во однос на директориумот во кој ќе започне пребарувањето. Не користете ја апсолутната патека од коренот на датотечниот систем.
grep -R --exclude-dir=backup --exclude-dir=backup2 "vorpal" /home/dave/data
Можеме да користиме и групирања. Можеме да го постигнеме истото попрецизно со:
grep -R --exclude-dir={backup,backup2} "vorpal" /home/dave/data
Можете да комбинирате исклучувања на датотеки и директориуми во истата команда. Ако сакате да ги исклучите сите датотеки од директориумот и да исклучите одредени типови датотеки од директориумите што се пребарувате, користете ја оваа синтакса:
grep -R --exclude=*.{csv,md} --exclude-dir=backup/archive "frumious" /home/dave/data
Понекогаш тоа е она што го оставате надвор
Понекогаш со grep
може да се чувствувате како да се обидувате да најдете игла во стог сено. има голема разлика да се отстрани стогот сено.