Команда grep в Linux

Что такое утилита grep и как ее установить
Grep — это эффективная утилита для поиска текста, встроенная в каждый из популярных дистрибутивов ОС семейства GNU / Linux. Однако даже в том маловероятном случае, если данное приложение отсутствует в вашей сборке, его можно без лишних сложностей установить. В этом Вам поможет менеджер пакетов (apt — в дистрибутивах на основе Debian и Ubuntu, yum — в дистрибутивах на основе RHEL, Fedora и CentOS).
Устанавливаем grep в дистрибутивах Debian и Ubuntu
Чтобы установить утилиту grep в дистрибутивах Debian и Ubuntu — введите в командную строку с root-правами команду apt install и grep в качестве аргумента:
$ sudo apt install grep
Устанавливаем grep в дистрибутивах RHEL, CentOS и Fedora
Чтобы установить утилиту grep в дистрибутивах RHEL, CentOS и Fedora — введите в командную строку с root-правами команду yum install и grep в качестве аргумента:
$ sudo yum install grep
Примеры интересного использования команды grep в Linux
Скорее всего, наиболее простым и органичным путем изучения возможностей команды grep является практика. Потому мы советуем опробовать самые распространенные примеры.
Поиск файлов с помощью команды grep
Допустим, что вы установили на свой ПК популярный дистрибутив Ubuntu. И в дальнейшем планируете добавить в библиотеку Python определенные скрипты. С другой стороны, на веб-сайте с необходимыми материалами указано, что они есть для разных версий языка программирования Python. При этом вы не знаете точно, какая именно версия присутствует в вашей версии Ubuntu. А также — какие дополнительные модули идут в комплекте. Для выяснения таких подробностей — поставьте знак конвейера (|) после команды dpkg с опцией -l и добавьте далее команду grep с опцией -i и аргументом python:
# dpkg -l | grep -i python
Пример вывода:
ii python2.7 2.7.3-0ubuntu3.4 Interactive high-level object-oriented language (version 2.7) ii python2.7-minimal 2.7.3-0ubuntu3.4 Minimal subset of the Python language (version 2.7) ii python-openssl 0.12-1ubuntu2.1 Python wrapper around the OpenSSL library ii python-pam 0.4.2-12.2ubuntu4 A Python interface to the PAM library
Команда dpkg -l выводит на экран установленные пакеты с расширением *.deb. Результат вывода с помощью символа передается по конвейеру команде grep. При этом опция -i позволяет команде игнорировать регистр в названиях.
Важно: команды Linux вообще и grep в частности чувствительны к регистру — потому стоит выработать привычку к использованию опции -i, чтобы не упускать все возможные результаты.
Фильтрация содержимого файлов с помощью команды grep (игнорирование закомментированных строк)
Стоит отметить, что команда grep может использоваться и для фильтрации результатов поиска внутри одного или нескольких файлов.
Допустим, что Ваш веб-сервер Apache работает неправильно. И вы решили обратиться на форум в Интернете для поиска возможных вариантов решения проблемы. Члены сообщества посоветовали показать им содержимое файла /etc/apache2/sites-available/default-ssl. Однако данный файл содержит много закомментированных строк.
К счастью, строки с комментариями можно легко отфильтровать. Для этого введите команду grep с опцией –v и добавьте в качестве первого аргумента знак хэштега в кавычках ("#"), а в качестве второго аргумента путь к расположению файла:
# grep –v "#" /etc/apache2/sites-available/default-ssl
Опция –v указывает команде, что на экран нужно выводить те строки, в которых нет искомого выражения. Тогда как по умолчанию вывод состоит из строк, включающих искомое выражение. Применительно к нашему примеру — будут выведены только незакомментированные строки.
Обнаружение всех файлов с расширением .mp3 с помощью команды grep
Команда grep незаменима в случае фильтрации результатов из стандартного потока 1 (stdout).
Допустим, на Вашем ПК имеется каталог, содержащий множество музыкальных файлов в разных форматах. И по какой-то причине Вам понадобилось вывести список всех файлов с расширением *.mp3, которые созданы исполнителем ABC и не являются ремиксами. Для этого введите в командную строку следующую комбинацию команд:
# find . –name "*.mp3" | grep –i "ABC" | grep –vi "remix"
Теперь давайте проанализируем использованные команды, опции и аргументы:
find— утилита поиска файлов в файловой системе;.— указывает, что поиск следует вести относительно текущего рабочего каталога;–name— проверяет название файлов на соответствие заданному шаблону;"*.mp3"— шаблон, соответствующий файлам искомого формата;|— объединяет команды в конвейер (вывод первой команды передается на ввод второй — и так далее);grepс опцией–i— поиск по выводу командыfindс игнорированием регистра;"ABC"— шаблон, по которому осуществляется поиск;grep –vi— поиск по выводу предыдущей командыgrepи исключение результатов, соответствующих заданному шаблону;"remix"— шаблон, по которому осуществляется поиск.
В результате первая команда находит все файлы с расширением *.mp3 в названии. После чего результаты вывода фильтруются первой командой grep и находятся строки, включающие название исполнителя — "ABC". Далее результаты вывода фильтруются второй командой grep — и из них исключаются строки, содержащие шаблон "remix".
Отображение строк до или после строки с результатом поиска
Часто пользователю нужно вывести на экран не только строку, содержащую искомый шаблон. Но и несколько строк до или после нее, чтобы лучше понимался контекст. Специально на такой случай у команды grep есть две особых опции:
-A(от англ. After) — указанное количество строк до шаблона;-B(от англ. Before) — указанное количество строк после шаблона.
Попробуем отфильтровать вывод команды ifconfig, который для непривычного пользователя может быть излишне объемным.
Таким образом Вы получите строку, содержащую шаблон eth0, а также 4 строки до нее:
# ifconfig | grep –A 4 eth0
Тогда как таким способом Вы получите строку, содержащую шаблон UP, а также 2 строки после нее:
# ifconfig | grep -B 2 UP
В результате у Вас на экране будет ровно столько информации, сколько Вам нужно в конкретный момент.
Выведение заданного числа всех соседних строк с помощью команды grep
В том случае, если Вы точно не знаете, какие именно соседние строки (до или после строки, содержащей шаблон) Вам нужны — воспользуйтесь командой grep с опцией -C. Следующая комбинация команд выведет на экран по 2 строки до и после строчки вывода команды ifconfig, содержащей шаблон lo:
# ifconfig | grep -C 2 lo
Подсчет числа строк, содержащих искомое выражение
В некоторых случаях Вам могут понадобится не сами строчки, включающие заданное выражение, а их общее количество. В таком случае воспользуйтесь опцией -c. Следующая комбинация команд выведет на экран количество строк в выводе команды ifconfig, включающих шаблон inet6.
# ifconfig | grep -c inet6
Указание номера искомой строки в файле
Еще один полезный прием, которым часто пользуются разработчики и тестировщики программного обеспечения — это выяснение номера строки, включающей заданный шаблон. Для этого введите в командную строку команду grep с опцией -n:
# grep –n "main" setup.py
В результате на экран будут выведены строки, включающие шаблон ("main"), а также — их порядковые номера в файле setup.py.
Важно: нумерация при использовании опции -n команды grep ведется с единицы, а не с нуля
Рекурсивный поиск строки по всем каталогам с помощью команды grep
Предположим, что Вам необходимо найти все вложения указанного выражения в текущем каталоге со всеми его подкаталогами и так далее. Для этого добавьте к команде grep опцию -r:
# grep –r "function" *
В результате утилита будет рекурсивно искать выражение "function" по всему дереву каталогов, начинающемуся с рабочего каталога.
Выведение точного вхождения выражения как отдельного слова
По умолчанию утилита считает соответствующими условиям поиска и те случаи, в которых шаблон является частью более длинного слова. В тех случаях, когда Вас интересует полное совпадение — воспользуйтесь командой grep с опцией -w:
# ifconfig | grep –w "RUNNING"
В результате на экране будут показаны строки вывода команды ifconfig, которые содержат шаблон RUNNING в качестве отдельного слова.
При этом частичное соответствие с искомым шаблоном больше не будет приводить к выводу того же результата. То есть, следующий пример приведет к иному выводу:
# ifconfig | grep –w "RUN"
В результате на экране будут показаны строки вывода команды ifconfig, которые содержат шаблон RUN в качестве отдельного слова.
Поиск в архивах gzip
Утилита gzip (от англ. GNU Zip) — это популярный инструмент для сжатия данных без потерь в Linux, использующий алгоритм Deflate.
При этом с помощью команды zgrep можно вести поиск по сжатому архиву точно так же, как Вы это делали вне сжатого архива с помощью команды grep. Следующая команда будет искать в архиве /var/log/syslog.2.gz строки, содержащие шаблон error с игнорированием регистра:
# zgrep –i error /var/log/syslog.2.gz
Проверка на соответствие более сложному регулярному выражению в файлах с помощью команды egrep
Утилита egrep — это почти полный аналог утилиты grep, однако с дополнительными возможностями. В частности, с ее помощью можно вести поиск по расширенным регулярным выражениям (например, с использованием метасимволов).
Команда egrep незаменима при попытке найти что-либо в исходном коде программы.
Стоит отметить, что функции egrep можно использовать и в обычном варианте grep. Для этого добавьте к команде опцию -E:
# grep -E
Выявление целой строки, соответствующей выражению
Последняя в рамках этой статьи функция — это поиск строк, полностью соответствующих искомому выражению. Для этого используется fgrep — еще одна команда, производная от обычной команды grep. К такому же результату приведет использование команды grep с опцией -F.
Кроме того, fgrep с опцией -f будет построчно брать шаблоны для поиска из файла, путь к которому указан в качестве первого аргумента (file_full_of_patterns.txt). И выполнять их поиск в файле, путь к которому указан в качестве второго аргумента (file_to_search.txt):
# fgrep –f file_full_of_patterns.txt file_to_search.txt
В результате на экран будут выведены строки, полностью совпадающие в обоих файлах. Подобный прием особенно полезен при работе с объемными файлами настроек, файлами журналов (логами) и т.п.