Како да се исклучат шаблони, датотеки и директориуми со 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 може да се чувствувате како да се обидувате да најдете игла во стог сено. има голема разлика да се отстрани стогот сено.