Како да ја користите командата grep на Linux


Командата за Linux grep е алатка за совпаѓање низа и шаблони што прикажува соодветни линии од повеќе датотеки. Работи и со цевководен излез од други команди. Ви покажуваме како.

Приказната зад гр

Командата grep е позната во круговите на Linux и Unix поради три причини. Прво, тоа е неверојатно корисно. Второ, богатството на опции може да биде огромно. Трето, напишано е преку ноќ за да се задоволи одредена потреба. Првите две се тресне; третиот е малку исклучен.

Кен Томпсон ги извлече можностите за пребарување на редовните изрази од уредникот ed (се изговара ee-dee) и создаде мала програма - за своја сопствена употреба - за пребарување низ текстуални датотеки. Неговиот шеф на одделот во Bell Labs, Даг Мекилрој, му пришол на Томпсон и го опишал проблемот со кој се соочувал еден од неговите колеги, Ли Мекмахон.

Мекмахон се обидуваше да ги идентификува авторите на федералистичките трудови преку текстуална анализа. Му требаше алатка која може да бара фрази и низи во текстуални датотеки. Томпсон потроши околу еден час таа вечер правејќи ја својата алатка општа алатка што може да ја користат другите и ја преименува во grep. Тој го зеде името од низата наредби ed g/re/p , што се преведува како „глобално пребарување на регуларни изрази“.

Можете да го гледате Томпсон како разговара со Брајан Керниган за раѓањето на grep.

Едноставни пребарувања со grep

За да пребарувате низа во датотека, пренесете го терминот за пребарување и името на датотеката на командната линија:

Се прикажуваат линии кои одговараат. Во овој случај, тоа е една линија. Текстот што одговара е означен. Тоа е затоа што на повеќето дистрибуции grep е алијас на:

alias grep='grep --colour=auto'

Ајде да ги погледнеме резултатите каде што има повеќе линии што се совпаѓаат. Ќе го бараме зборот „Просечно“ во датотеката за дневник на апликацијата. Бидејќи не можеме да се потсетиме дали зборот е со мали букви во датотеката за евиденција, ќе ја користиме опцијата -i (игнорирај букви):

grep -i Average geek-1.log

Се прикажува секоја линија што одговара, а во секоја е означен соодветниот текст.

Можеме да ги прикажеме линиите што не се совпаѓаат со користење на опцијата -v (инвертирај совпаѓање).

grep -v Mem geek-1.log

Нема истакнување бидејќи тоа се линиите што не се совпаѓаат.

Можеме да предизвикаме grep да биде целосно тивок. Резултатот се пренесува на школката како повратна вредност од grep. Резултатот од нула значи дека низата беше пронајдена, а резултатот од еден значи дека не е пронајдена. Можеме да го провериме повратниот код користејќи ги специјалните параметри  $?:

grep -q average geek-1.log
echo $?
grep -q howtogeek geek-1.log
echo $?

Рекурзивни пребарувања со grep

За да пребарувате низ вгнездени директориуми и поддиректориуми, користете ја опцијата -r (рекурзивна). Забележете дека не давате име на датотека на командната линија, мора да наведете патека. Овде бараме во тековниот директориум . и сите поддиректориуми:

grep -r -i memfree .

Излезот ги вклучува директориумот и името на датотеката на секоја линија што одговара.

Можеме да направиме grep  да следи симболични врски со користење на опцијата -R (рекурзивна дереференција). Имаме симболична врска во овој директориум, наречена папка за дневници. Посочува на /home/dave/logs.

ls -l logs-folder

Да го повториме нашето последно пребарување со опцијата -R (рекурзивна дереференција):

grep -R -i memfree .

Симболичката врска се следи и директориумот на кој укажува се пребарува и од grep.

Барање цели зборови

Стандардно, grep ќе одговара на линија ако целта за пребарување се појавува каде било во таа линија, вклучително и во друга низа. Погледнете го овој пример. Ќе го бараме зборот „бесплатно“.

grep -i free geek-1.log

Резултатите се линии кои ја имаат низата „слободна“ во нив, но тие не се посебни зборови. Тие се дел од низата „MemFree“.

За да го принудите grep да одговара само на одделни „зборови“, користете ја опцијата -w (регексп на зборот).

grep -w -i free geek-1.log
echo $?

Овој пат нема резултати бидејќи терминот за пребарување „бесплатно“ не се појавува во датотеката како посебен збор.

Користење на повеќе термини за пребарување

Опцијата -E (продолжен регексп) ви овозможува да пребарувате повеќе зборови. (Опцијата -E ја заменува застарената верзија egrep на grep.)

Оваа команда бара два поима за пребарување, „просечно“ и „мембесплатно“.

grep -E -w -i "average|memfree" geek-1.log

Сите линии што се совпаѓаат се прикажани за секој од поимите за пребарување.

Можете исто така да пребарувате за повеќе поими кои не се нужно цели зборови, но може да бидат и цели зборови.

Опцијата -e (шеми) ви овозможува да користите повеќе изрази за пребарување на командната линија. Ја користиме функцијата заграда за редовни изрази за да создадеме шема за пребарување. Му кажува на grep да одговара на кој било од знаците содржани во заградите „[]. Ова значи дека grep ќе одговара на „kB“ или „KB“ додека пребарува.

И двете низи се совпаѓаат и, всушност, некои линии ги содржат двете низи.

Точно совпаѓање на линиите

 -x (линија regexp) ќе одговара само на линиите каде што целата линија се совпаѓа со терминот за пребарување. Ајде да бараме печат за датум и време за кој знаеме дека се појавува само еднаш во датотеката за евиденција:

grep -x "20-Jan--06 15:24:35" geek-1.log

Се наоѓа и прикажува единствената линија што се совпаѓа.

Спротивно на тоа е само прикажување на линиите што не се совпаѓаат. Ова може да биде корисно кога гледате конфигурациски датотеки. Коментарите се одлични, но понекогаш е тешко да се забележат вистинските поставки меѓу сите нив. Еве ја датотеката /etc/sudoers:

Можеме ефективно да ги филтрираме линиите за коментари вака:

sudo grep -v "#" /etc/sudoers

Тоа е многу полесно да се анализира.

Се прикажува само совпаѓачки текст

Може да има прилика кога не сакате да ја видите целата линија што одговара, само текстот што се совпаѓа. Опцијата -o (само што се совпаѓа) го прави токму тоа.

grep -o MemFree geek-1.log

Приказот е намален на прикажување само на текстот што одговара на терминот за пребарување, наместо целата линија што одговара.

Броење со греп

grep не е само текст, туку може да обезбеди и нумерички информации. Можеме да направиме grep да ни смета на различни начини. Ако сакаме да знаеме колку пати терминот за пребарување се појавува во датотека, можеме да ја користиме опцијата -c (count).

grep -c average geek-1.log

grep известува дека терминот за пребарување се појавува 240 пати во оваа датотека.

Можете да направите grep да го прикажува бројот на линијата за секоја линија што одговара со користење на опцијата -n (број на линија).

grep -n Jan geek-1.log

Бројот на линијата за секоја линија што одговара се прикажува на почетокот на линијата.

За да го намалите бројот на прикажани резултати, користете ја опцијата -m (max count). Ќе го ограничиме излезот на пет линии што се совпаѓаат:

grep -m5 -n Jan geek-1.log

Додавање контекст

Често е корисно да имате можност да видите некои дополнителни линии - можеби линии што не се совпаѓаат - за секоја линија што одговара. може да помогне да разликувате кои од поклопените линии се оние за кои ве интересира.

За да прикажете неколку линии по линијата што одговара, користете ја опцијата -A (по контекст). Бараме три линии во овој пример:

grep -A 3 -x "20-Jan-06 15:24:35" geek-1.log

За да видите некои линии од пред линијата што одговара, користете ја опцијата -B (контекст пред).

grep -B 3 -x "20-Jan-06 15:24:35" geek-1.log

И за да вклучите линии од пред и по линијата што одговара, користете ја опцијата -C (контекст).

grep -C 3 -x "20-Jan-06 15:24:35" geek-1.log

Прикажани датотеки што се совпаѓаат

За да ги видите имињата на датотеките што го содржат терминот за пребарување, користете ја опцијата -l (датотеки со совпаѓање). За да дознаете кои датотеки со изворниот код C содржат референци до датотеката за заглавие sl.h, користете ја оваа команда:

grep -l "sl.h" *.c

Имињата на датотеките се наведени, а не линиите што се совпаѓаат.

И, се разбира, можеме да бараме датотеки што не го содржат терминот за пребарување. Опцијата -L (датотеки без совпаѓање) го прави токму тоа.

grep -L "sl.h" *.c

Почеток и крај на линиите

Можеме да го принудиме grep да прикажува само совпаѓања што се или на почетокот или на крајот на линијата. Операторот со регуларен израз „^“ се совпаѓа со почетокот на линијата. Практично сите линии во датотеката за евиденција ќе содржат празни места, но ние ќе бараме линии што имаат празно место како прв знак:

grep "^ " geek-1.log

Се прикажуваат линиите што имаат празно место како прв знак - на почетокот на линијата.

За да одговарате на крајот на линијата, користете го операторот со регуларен израз „$“. Ќе бараме линии што завршуваат со „00“.

grep "00$" geek-1.log

На екранот се прикажуваат линиите кои имаат „00“ како нивни последни знаци.

Користење на цевки со grep

Се разбира, можете да го внесете влезот во grep , да го внесете излезот од grep во друга програма и да имате grep сместено во средината на цевката синџир.

Да речеме дека сакаме да ги видиме сите појави на низата „ExtractParameters“ во датотеките со изворниот код C. Знаеме дека ќе има неколку, па го внесуваме излезот во less:

grep "ExtractParameters" *.c | less

Излезот е претставен во less.

Ова ви овозможува да страницата низ списокот со датотеки и да ја користите lesss алатката за пребарување.

Ако го внесеме излезот од grep во wc и ја користиме опцијата -l (линии), можеме да го броиме бројот на линии во изворот код датотеки кои содржат „ExtractParameters“. (Ова би можело да го постигнеме со помош на опцијата grep -c (count), но ова е уреден начин да се демонстрира извлекувањето на цевки од grep.)

grep "ExtractParameters" *.c | wc -l

Со следната команда, го внесуваме излезот од ls во grep и го ставаме излезот од grep во sort . Ги наведуваме датотеките во тековниот директориум, ги избираме оние со низата „Август“ во нив и ги подредуваме според големината на датотеката:

ls -l | grep "Aug" | sort +4n

Да го растуриме тоа:

  • ls -l: Изведете список на датотеки со долг формат користејќи ls.
  • grep „август“: изберете ги линиите од списокот ls што имаат „август“ во нив. Имајте предвид дека ова ќе најде и датотеки што имаат „август“ во нивните имиња.
  • сортирање +4n: Подреди го излезот од grep на четвртата колона (големина на датотеката).

Добиваме сортиран список на сите датотеки модифицирани во август (без разлика на годината), по растечки редослед на големината на датотеката.

grep: Помалку команда, повеќе сојузник

grep е одлична алатка што треба да ја имате на располагање. Датира од 1974 година и сè уште е силно бидејќи ни треба она што го прави, а ништо не го прави подобро.

Спојувањето на grep со некои регуларни изрази-fu навистина го носи на следното ниво.

RELATED: Best Linux Laptops for Developers and Enthusiasts