img

Руководство по команде grep в Linux

21 ноября
20:00
Бесплатный вебинар
Введение в Docker
Ведущий — Филипп Игнатенко.
Руководитель центра разработки
Записаться
img
img

То, что система Linux предоставляет пользователю большое многообразие разного функционала уже не секрет. На одном из прошлых материалов мы рассмотрели, как и где можно использовать команду find. В этой же статье мы на примерах разберём команду grep, мощный инструмент системных администраторов.


Про Linux за 5 минут | Что это или как финский студент перевернул мир?


Для чего мы пользуемся 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 сортировка результата

Вот и всё. Надеемся материал окажется полезным для вас.

Ссылка
скопирована
Получите бесплатные уроки на наших курсах
Все курсы
Системное администрирование
Скидка 10%
Администратор Linux
Стань Linux администратором и сделай весомый шаг в сторону карьеры в DevOps. Самые важные знания от сертифицированного и практикующего тренера с 20 летним стажем
Получи бесплатный
вводный урок!
Пожалуйста, укажите корректный e-mail
отправили вводный урок на твой e-mail!
Получи все материалы в telegram и ускорь обучение!
img
Еще по теме:
img
Fail2ban — это программное обеспечение, которое защищает ваш сервер от атак. ПО отслеживает журналы сервера и выявляет любую под
img
Виртуализация серверов — популярная тема в мире ИТ, особенно на уровне предприятий. Она позволяет разным операционным системам з
img
  Введение Системные вызовы выступают в роли посредников между приложениями и ядром. Они создают уровень абстракции, который защ
img
  Введение SWAP (SWAP-память или SWAP-пространство) – это раздел жесткого диска или SSD компьютера, где операционная система (ОС
img
  Введение Абсолютные и относительные пути определяют расположение файла или каталога в файловой системе. Это набор инструкций д
img
  Введение Файлы конфигурации Linux определяют поведение и функциональное наполнение операционной системы. Файлы конфигурации –
21 ноября
20:00
Бесплатный вебинар
Введение в Docker