ѕодпишитесь на наш Telegram-канал Ѕудьте в курсе последних новостей 👇 😉 ѕодписатьс€
ѕоддержим в трудное врем€ —пециальное предложение на техническую поддержку вашей »“ - инфраструктуры силами наших экспертов ѕодобрать тариф
ѕоставка оборудовани€ √аранти€ и помощь с настройкой. —кидка дл€ наших читателей по промокоду WIKIMERIONET  упить
»нтерфейс статистики Merion Mertics показывает ключевые диаграммы и графики по звонкам, а также историю звонков в формате, который легко поймет менеджер ѕопробовать бесплатно
¬недрение
офисной телефонии
Ўаг на пути к созданию доступных унифицированных коммуникаций в вашей компании ¬недрить
»нтеграци€ с CRM ѕомогаем навести пор€док с данными
и хранить их в единой экосистеме
ѕодключить
»“ Ѕезопастность ”мна€ информационна€ безопасность дл€ вашего бизнеса «аказать
ћерион Ќетворкс

10 минут чтени€

“о, что система Linux предоставл€ет пользователю большое многообразие разного функционала уже не секрет. Ќа одном из прошлых материалов мы рассмотрели, как и где можно использовать команду find. ¬ этой же статье мы на примерах разберЄм команду grep, мощный инструмент системных администраторов.


ƒл€ чего мы пользуемс€ grep-ом?

Grep это утилита командной строки Linux, который даЄт пользовател€м возможность вести поиск строки. — его помощью можно даже искать конкретные слова в файле. “акже можно передать вывод любой команды в grep, что сильно упрощает работу во врем€ поиска и траблшутинга.

¬озьмЄм команду ls. —ама по себе она выводит список всех файлов и папок.

вывод ls без grep

Ќо если нужно найти конкретную папку или один файл среди сотни других, то мы можем передать вывод команды ls в grep через вертикальную черту (|), а уже grep-у параметром передать нужное слово.

$ ls | grep Documents
ls с использованием grep

≈сли команда grep ничего не вернула, значит искомого файла/папки не существует в данной директории.

grep без результатов

ѕоиск строк

≈сли же нужно найти не одно слово, а словосочетание или целое предложение, то параметр команды grep должно быть выделено кавычками. Grep поддерживает как одинарные, так и двойные кавычки.

$ ls | grep 'My Documents'
grep дл€ строковых данных

Ќесмотр€ на то, что команда grep чаще используетс€ как своего рода фильтр дл€ других команд, но еЄ также можно использовать отдельно как на примере ниже.

$ grep 'Class 1' Students.txt
grep дл€ строковых данных внутри документа

¬ этом примере мы вели поиск указанных в кавычках слов в файле Students.txt и команда grep успешно справилась со своей задачей.


ѕоиск по нескольким параметрам

 оманде grep можно передавать не один параметр, а несколько. ƒл€ этого перед каждым аргументом пишетс€ ключ e. Ёту команду система понимает, как "или-или" и выводит все вхождени€ указанных слов. «аметьте, что кавычками выделена только строка, котора€ содержит пробел.

$ grep -e 'Class 1' -e Todd Students.txt
grep и несколько параметров фильтрации

–азница между grep, egrep fgrep, pgrep, zgrep

»сторически разные версии Linux-а включали разновидности команды grep. ’от€ в современных верси€ систем базова€ команда grep поддерживает все возможности, которыми обладают egrep fgrep, pgrep, zgrep, но все же их тоже стоит рассмотреть.

команда grep

 ак видно из вывода man grep (мануал по команде grep), все эти версии всего лишь разные названи€ основной команды. Ќапример, egrep это тоже самое, что и grep E (помните, командна€ строка Linux регистрозависима€ и команды grep e и grep E интерпретируютс€ по разному). Ётой команде в качестве шаблона передаетс€ расширенное регул€рное выражение. —уществует очень много разных ситуаций, где можно воспользоватьс€ этой командой. Ќапример, две команды ниже эквивалентны и вывод€т все строки, в которых есть две подр€д идущих буквы "p".

$ egrep p\{2} fruits.txt
$ grep -E p\{2} fruits.txt
пример egrep

Fgrep это команда grep F, котора€ обрабатывает переданный шаблон как список фиксированных данных строкового типа. Ёта команда полезна, когда в шаблоне используютс€ зарезервированные дл€ регул€рных выражений символы, которые при обычно grep пришлось бы экранировать.

пример fgrep

 оманда pgrep используетс€ дл€ поиска конкретного процесса, запущенного в системе и возвращает идентификатор указанного процесса (PID).  оманда ниже выводит PID процесса sshd. ѕочти такого же результата можно достичь если запустить команду ps e | grep sshd.

$ pgrep sshd
prgrep или ps

 оманда zgrep используетс€ дл€ поиска указанного шаблона в заархивированных файлах, что очень удобно так как не приходитс€ сначала разархивировать файл, а потом уже вести поиск.

$ zgrep apple fruits.txt.gz
zgrep пример использовани€

Zgrep также работает с tar архивами, но ограничиваетс€ лишь выводом информации о том, нашла ли она соответствие или нет. Ёто замечание мы сделали потому, что чаще всего gzip-ом архивируютс€ tar файлы.

zgrep и работа с tar архивами

–азница между find и grep

“е, кто только начинает пользоватьс€ командной строкой Linux должны понимать, что find и grep это две разные команды, которые имеют совсем разные функции, даже если оба используютс€ дл€ "поиска" чего-либо.

ѕри поиске файлов grep-ом удобно пользоватьс€ дл€ фильтрации вывода команды find, как и было показано в начале материала. Ќо если нужно найти какой-то файл в системе по его названию или части названи€ (при этом используетс€ маска *), то лучше всего обратитьс€ к find. ќна выведЄт точно расположение искомого файла.

$ find /path/to/search -name name-of-file
команда find

–екурсивный поиск

„тобы вести поиск по указанному шаблону среди всех файлов во всех папках и подпапках, команду grep нужно запустить с ключом r.  оманда выведет все файлы, где найдено совпадение с указанным шаблоном, а также путь к ним. ѕо умолчанию поиск ведетс€ по текущей директории и поддиректори€х.

$ grep -r pattern /directory/to/search
рекурсивный поиск grep

Ќайти пробелы и табул€цию

 ак и было отмечено ранее, если в шаблоне поиска содержитс€ пробел, то мы должны выдел€ть строку кавычками. Ёто мы можем использовать дл€ поиска пробелов и знаков табул€ции в файле. ќ том как вставить табул€цию чуть позже.

$ grep " " sample.txt
учет пробелов в grep

≈сть несколько путей вставки табул€ции, но некоторые дистрибутивы могут не поддерживать их.  ак известно, в командной строке Linux клавиша TAB сама по себе дополн€ет введЄнную команду. Ќо если комбинировать клавиши ctrl+v, а затем нажать TAB, то система воспримет это как знак табул€ции. $ grep " " sample.txt

табул€ци€ в grep

Ёта фишка очень помогает при поиске среди конфигурационных файлов системы, так как значени€ от параметров отдел€ютс€ табул€цией.


»спользование регул€рных выражений

–егул€рные выражени€ сильно расшир€ют возможности команды grep, что позвол€ет нам вести более гибкий поиск. ƒалее мы рассмотрим несколько вариантов использовани€ регул€рных выражений.

[квадратные скобки] они используютс€ чтобы проверить на соответствие одному из указанных символов.

$ grep "Class [123]" Students.txt
использование квадратных скобок в grep

[-] знак дефиса означает диапазон значений. Ёто могут быть как буквы, так и цифры.

$ grep "Class [1-3]" Students.txt
использование диапазонов значений в квадратных скобках grep

¬тора€ команда вывела то же, что и перва€, но здесь мы обошлись знаком диапазона.

^ каретка используетс€ дл€ поиска строк, которые начинаютс€ с указанного шаблона.  оманда ниже выведет все строки, которые начинаютс€ с буквы "ј".

$ grep "^A" Students.txt
каретка в grep

[^] но между квадратными скобками смысл каретки мен€етс€. «десь он исключает из поиска следующие за ней символы или диапазон символов.

$ grep "Class [^1-2]" Students.txt
каретка между квадратных скобок в grep

$ знак доллара означает конец строки.  оманда выведет только те строки, в конце которых встречает указанный шаблон.

$ grep "1$" Students.txt
знак доллара в grep

.точка обозначает один любой символ. „тобы указать несколько любых символов, можно написать символ точку нужное количество раз.

$ grep "A.a" Students.txt
использование точки в grep

»ли же можно использовать квантификаторы.

 вантификатор

„исло повторений

ѕример

ѕодход€щие строки

{n}

–овно n раз

’а{3}ха

’аааха

{m,n}

ќт m до n включительно

’а{2,4}ха

’аа, ’ааа, ’ааааха

{m,}

Ќе менее m

’а{2,}ха

’ааха, ’аааха, ’ааааха и т. д.

{,n}

Ќе более n

’а{,3}ха

’ха, ’аха, ’ааха, ’аааха

 вантификатор

јналог

«начение

?

{0,1}

Ќоль или одно вхождение

*

{0,}

Ќоль или более

+

{1,}

ќдно или более

ѕоиск в gz файлах без разархивировани€

 ак и было сказано выше, мы можем искать файлы внутри архива командой zgrep. ≈сть аналогична€ команда, котора€ отличаетс€ тем, что вывод передаетс€ grep дл€ фильтрации.

$ zcat file.gz | grep word-to-search
использование zcat

¬ыбрать e-mail из файла

»ногда приходитс€ искать e-mail адреса из какого-либо файла. ƒелать это вручную достаточно затратно в плане времени. » тут нам на помощь приходит команда grep с регул€рным выражением необычной на первый взгл€д формы.

$ grep -o '[[:alnum:]+\.\_\-]*@[[:alnum:]+\.\_\-]*' emails.txt

 люч o указывает на то, что нам нужно выбрать только e-mail адреса, а не все предложение, в котором встречаетс€ e-mail.

поиск email адресов с помощью grep

 ак мы уже убедились, Linux предоставл€ет большое число возможностей дл€ выполнени€ одной задачи. “ак же и в этом случае. ћы могли бы воспользоватьс€ командой egrep с разными регул€рными выражени€ми. Ќо указанна€ выше команда наиболее проста дл€ вывода только адресов электронной почты, игнориру€ при этом всЄ остальное.


¬ыбрать IP адрес

¬ыбор IP адресов немного сложнее, так как мы не можем просто вз€ть строку из цифр, разделЄнных точкой. ¬ернее, можем, но это не будет валидным IP адресом. ј вот команда ниже выведет нам список правильных IP адресов.

$ grep -E -o "(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)" /var/log/auth.log

Ќа скриншоте ниже мы вывели список IP, с которых была попытка подключени€ по SSH.

поиск ip адресов с помощью grep

ќператор »Ћ»

—уществует очень много разных вариантов использовани€ условного оператора »Ћ» (OR) с командой grep. Ќо мы покажем самое простое и запоминающеес€ выражение.

$ grep -E 'string1|string2' filename
$ egrep 'string1|string2' filename
grep с логическим оператором или

»гнорировать регистр

ѕо умолчанию, grep чувствительна к регистру, что немного мешает поиску, так как мы должны точно указать регистр букв при поиске. Ёта проблема решаетс€ путем добавлени€ ключа i к команде поиска.

$ grep -i string filename
grep игнорировать регистр

 ак видно из скриншота, мы вывели слова независимо от того какими буквами они набраны.


ѕоиск с учЄтом регистра

„то если нам нужно найти строку, где перва€ буква может быть, как заглавной, так и строчной? Grep с ключом i тут не поможет. —амый простой способ реализовать это показана ниже.

$ grep [Ss]tring filename
сделать grep чувствительным к регистру

Ќайти точное соответствие

¬ запросах выше нам возвращались все строки, в которых содержалось слово apple. „тобы избежать такого можно прописать команду ниже.

$ grep "\<apple\>" fruits.txt
точное совпадение с grep

ѕравда есть еще метод с ключом w. Ќо это сработает только в том случае, если вы уверены, что после искомого слова нет никакого текста.


»сключить шаблон

„тобы просмотреть содержание файла с исключением конкретной строки к запросу нужно добавить ключ v.

$ grep -v string-to-exclude filename
»сключить шаблон с grep

Ќайти и заменить

ƒл€ поиска и замены одного текста другим командой grep, нужно запустить еЄ, а вывод передать команде sed.  оманда ниже заменить все вхождени€ строки "string1", на "string2" во всех файлах в текущей директории.

$ grep -rl 'string1' ./ | xargs sed -i 's/string1/string2/g'

¬ывод номера строки

„тобы показать номер строки, где была найдена искома€ строка, команду grep следует запускать с ключом n.

$ grep -n string filename
grep вывод номера строки совпадени€

ѕоказать строки до и после

≈сли нужно узнать в каком контексте употребл€лась искома€ фраза, можно вывести предложени€ предшествующее и следующее за указанной строкой. ƒл€ этого нужно запустить команду grep с ключом c и передать число строк дл€ отображени€.

$ grep -c 1 string filename
grep показать строки до и после

—ортировка результата

„тобы отсортировать вывод команды grep по какому-либо пор€дку, за ней следует прописать команду sort через вертикальную чЄрточку (|). ѕо умолчанию sort отсортирует результат по алфавиту.

grep сортировка результата

¬от и всЄ. Ќадеемс€ материал окажетс€ полезным дл€ вас.