Как да използвате командата grep в Linux

Командата grep на Linux е помощна програма за съвпадение на низове и шаблони, която показва съвпадащи редове от множество файлове. Той също така работи с изходен изход от други команди. Ние ви показваме как.

Историята зад grep

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

Кен Томпсън извлече възможностите за търсене на регулярни изрази от редактора на ed (произнася се и-ди) и създаде малка програма — за собствена употреба — за търсене в текстови файлове. Неговият ръководител на отдела в 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

Няма подчертаване, защото това са несъвпадащите линии.

  6-те най-добри инструмента за управление на снимки за Linux

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

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

Рекурсивни търсения с grep

За да търсите във вложени директории и поддиректории, използвайте опцията -r (рекурсивна). Имайте предвид, че не предоставяте име на файл в командния ред, трябва да посочите път. Тук търсим в текущата директория „.“ и всякакви поддиректории:

grep -r -i memfree .

Резултатът включва директорията и името на файла на всеки съвпадащ ред.

Можем да накараме grep да следва символни връзки, като използваме опцията -R (рекурсивна дереферация). Имаме символична връзка в тази директория, наречена logs-folder. Той сочи към /home/dave/logs.

ls -l logs-folder

Нека повторим последното ни търсене с опцията -R (рекурсивно дерефериране):

grep -R -i memfree .

Следва се символната връзка и директорията, към която сочи, се търси и от grep.

Търсене на цели думи

По подразбиране grep ще съответства на ред, ако целта за търсене се появи някъде в този ред, включително вътре в друг низ. Вижте този пример. Ще търсим думата „безплатно“.

grep -i free geek-1.log

Резултатите са редове, които имат низа „free“ в тях, но не са отделни думи. Те са част от низа „MemFree“.

За да принудите grep да съвпада само с отделни „думи“, използвайте опцията -w (word regexp).

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

Този път няма резултати, защото думата за търсене „безплатно“ не се появява във файла като отделна дума.

Използване на множество термини за търсене

Опцията -E (разширено редовно изражение) ви позволява да търсите няколко думи. (Опцията -E замества отхвърленото egrep версия на grep.)

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

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

grep -E -w -i

Всички съвпадащи редове се показват за всяка от думите за търсене.

Изход от grep -E -w -i

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

Опцията -e (шаблони) ви позволява да използвате множество думи за търсене в командния ред. Използваме функцията за скоби за регулярни изрази, за да създадем шаблон за търсене. Той казва на grep да съответства на всеки един от знаците, съдържащи се в скобите “[]” Това означава, че grep ще съответства на „kB“ или „KB“, докато търси.

И двата низа са съпоставени и всъщност някои редове съдържат и двата низа.

Точно съвпадащи линии

-x (редовно изражение на ред) ще съвпада само с редове, където целият ред съответства на думата за търсене. Нека потърсим печат за дата и час, за който знаем, че се появява само веднъж в регистрационния файл:

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

grep -x

Единственият ред, който съвпада, се намира и показва.

  Как да играете на Space Engineers на Linux

Обратното на това е показването само на линиите, които не съвпадат. Това може да бъде полезно, когато разглеждате конфигурационни файлове. Коментарите са страхотни, но понякога е трудно да се открият действителните настройки сред всички тях. Ето файла /etc/sudoers:

Можем ефективно да филтрираме редовете за коментари по следния начин:

sudo grep -v "https://www.wdzwdz.com/496056/how-to-use-the-grep-command-on-linux/#" /etc/sudoers

sudo grep -v

Това е много по-лесно за анализиране.

Показва се само съответстващ текст

Може да има случай, когато не искате да видите целия съвпадащ ред, а само съответния текст. Опцията -o (само съвпадение) прави точно това.

grep -o MemFree geek-1.log

Дисплеят се намалява до показване само на текста, който съответства на думата за търсене, вместо на целия съвпадащ ред.

Броене с grep

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

grep -c average geek-1.log

grep съобщава, че думата за търсене се появява 240 пъти в този файл.

Можете да накарате grep да показва номера на реда за всеки съвпадащ ред, като използвате опцията -n (номер на ред).

grep -n Jan geek-1.log

Номерът на реда за всеки съвпадащ ред се показва в началото на реда.

За да намалите броя на резултатите, които се показват, използвайте опцията -m (макс. брой). Ще ограничим изхода до пет съвпадащи реда:

grep -m5 -n Jan geek-1.log

Добавяне на контекст

Възможността да видите някои допълнителни линии – вероятно несъвпадащи – за всеки съвпадащ ред често е полезно. може да ви помогне да разграничите кои от съвпадащите линии са тези, които ви интересуват.

За да покажете някои редове след съвпадащия ред, използвайте опцията -A (след контекст). В този пример искаме три реда:

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

grep -A 3 -x

За да видите някои редове преди съвпадащия ред, използвайте опцията -B (контекст преди).

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

grep -B 3 -x

И за да включите редове от преди и след съвпадащия ред, използвайте опцията -C (контекст).

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

grep -C 3 -x

Показване на съвпадащи файлове

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

grep -l "sl.h" *.c

grep -l

Изброени са имената на файловете, а не съвпадащите редове.

  Как да контролирате sudo достъпа в Linux

Изход от grep -l

И разбира се, можем да търсим файлове, които не съдържат думата за търсене. Опцията -L (файлове без съвпадение) прави точно това.

grep -L "sl.h" *.c

grep -L

Начало и край на редовете

Можем да принудим grep да показва само съвпадения, които са или в началото, или в края на ред. Операторът на регулярен израз „^“ съвпада с началото на ред. На практика всички редове в регистрационния файл ще съдържат интервали, но ще търсим редове, които имат интервал като първи знак:

grep "^ " geek-1.log

grep

Показват се редовете, които имат интервал като първи знак — в началото на реда.

Изход grep

За да съответствате на края на реда, използвайте оператора за регулярни изрази „$“. Ще търсим редове, които завършват с „00“.

grep "00$" geek-1.log

grep

Дисплеят показва редовете, които имат “00” като крайни знаци.

изход на grep

Използване на Pipes с grep

Разбира се, можете да пренасочвате входа към grep , да превеждате изхода от grep в друга програма и да имате grep сгушен в средата на веригата от канали.

Да кажем, че искаме да видим всички поява на низа “ExtractParameters” в нашите файлове с изходен код на C. Знаем, че ще има доста, така че прехвърляме изхода в по-малко:

grep "ExtractParameters" *.c | less

grep

Резултатът е представен в по-малко.

Изход от grep

Това ви позволява да разглеждате списъка с файлове и да използвате средството за търсене на less.

Ако преведем изхода от grep в wc и използваме опцията -l (lines), ние може да преброи броя на редовете във файловете с изходен код, които съдържат „ExtractParameters“. (Можем да постигнем това с помощта на опцията grep -c (count), но това е чист начин да демонстрираме тръбопроводи извън grep.)

grep "ExtractParameters" *.c | wc -l

grep

Със следващата команда прехвърляме изхода от ls в grep и прехвърляме изхода от grep в sort . Изброяваме файловете в текущата директория, като избираме тези с низа „Aug“ в тях, и ги сортирате по размер на файла:

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

ls -l |  grep

Нека разбием това:

ls -l: Изпълнете дълъг списък с формати на файловете с помощта на ls.
grep “Aug”: Изберете редовете от списъка с ls, които имат “Aug” в тях. Имайте предвид, че това ще намери и файлове, които имат „Aug“ в имената си.
sort +4n: Сортиране на изхода от grep в четвъртата колона (размер на файла).

Получаваме сортиран списък на всички файлове, променени през август (независимо от годината), във възходящ ред на размера на файла.

grep: По-малко команда, повече съюзник

grep е страхотен инструмент, който да имате на ваше разположение. Той датира от 1974 г. и все още е силен, защото имаме нужда от това, което прави, и нищо не го прави по-добре.

Свързването на grep с някои регулярни изрази-fu наистина го извежда на следващото ниво.