12 практических примеров команды grep в Linux

Материал из Home wiki
Перейти к навигации Перейти к поиску

Возможно, у вас уже возникала ранее необходимость найти в файлах заданный набор текста (строку или шаблон). Специально для решения подобной задачи существует такая интересная команда, как команда grep.

Что такое утилита grep и как ее установить

Grep — это эффективная утилита для поиска, встроенная в каждый из популярных дистрибутивов ОС GNU/Linux. Однако даже в том маловероятном случае, если данное приложение отсутствует в вашей сборке, его можно без лишних сложностей установить. И на это способен встроенный менеджер пакетов (apt-get в дистрибутивах Debian и Ubuntu, yum в дистрибутивах RHEL, Fedora и CentOS).

В Debian и Ubuntu:

$ sudo apt-get install grep

В RHEL, CentOS и Fedora:

$ sudo yum install grep

Примеры интересного использования команды

Скорее всего, наиболее простым и органичным путем изучения возможностей grep является практика. Потому мы советуем опробовать самые распространенные примеры.

Поиск необходимых файлов

Допустим, что вы установили на свой ПК популярный дистрибутив Ubuntu. И в дальнейшем планируете добавить в библиотеку Python определенные скрипты. С другой стороны, на веб-сайте с необходимыми материалами указано, что они есть для разных версий языка программирования Python. Тогда как вы не знаете точно, какая именно версия присутствует в вашей версии Ubuntu. А также — какие дополнительные модули идут в комплекте. Для выяснения таких подробностей можно использовать следующую команду:

# 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 python. При этом флаг -i позволяет команде не обращать внимания на регистр. Стоит отметить, что команды Linux вообще и grep в частности чувствительны к нему. В целом, стоит выработать в себе привычку к использованию флага -i, если цель поиска, конечно, не указывается более конкретно.


Фильтрация найденных командой grep файлов Помимо всего прочего, команда grep предназначена для фильтрации результатов поиска внутри одного или нескольких файлов. Например, в том случае, если у ваш веб-сервер Apache испытывает проблемы. И вы решили обратиться на форум в Интернете для поиска возможных вариантов решения. Предположим, что члены сообщества посоветовали вам показать им содержимое файла /etc/apache2/sites-available/default-ssl. Однако данный файл содержит помимо всего прочего и закомментированные строки. К счастью, с нашей командой их можно отфильтровать:

# grep –v "#"  /etc/apache2/sites-available/default-ssl

Стоит отметить, что флаг -v предназначен для того, чтобы выводить на экран противоположный результат фильтрации. Прежде всего, применительно к нашему примеру будут выведены те строки, которые не соответствуют выражению “#” (закомментированные).

Обнаружение всех файлов с расширением .mp3

Команда grep незаменима в случае фильтрации результатов из stdout (потока №1). Допустим, на вашем ПК имеется каталог, содержащий множество музыкальных файлов, соответствующих различным форматам. И по какой-то причине вам понадобилось вывести список всех файлов с расширением *.mp3. Которые помимо всего прочего созданы исполнителем ABC и не являются ремиксами. В результате можно посоветовать использовать команду find, дополненную несколькими конструкциями с grep:

# find . –name "*.mp3" | grep –i ABC | grep –vi "remix"

Поиском и выводом всех файлов, имеющих расширение *.mp3 занимается команда find. После чего через конвейер он передается сначала команде grep с флагом -i (проверяет наличие имени исполнителя «ABC»). После чего следующая по конвейеру команда grep с флагами -vi отсеивает из вывода результаты, содержащие слово «remix».

Отображение строк до или после строки с результатом поиска

Стоит упомянуть еще несколько флагов — -A и -B. Прежде всего, их назначение состоит в том, чтобы выводить совпадающую строку и указанное число соседних строк. А именно — находящихся перед или после найденного результата. Наверное, проще всего запомнить их назначение так:

-A — от слова «after»; -B —от слова «before». Пример использования флагов -A и -B:

# ifconfig | grep –A 4 eth0
# ifconfig | grep -B 2 UP

Выведение заданного числа всех соседних строк

Скорее всего, более удобен флаг -C для команды grep. Вместо того, чтобы проверять и выводить строки, которые появляются только до или только после нужного результата, он позволяет вести поиск в обоих направлениях:

# ifconfig | grep –C 2 lo

Подсчет числа строк, содержащих искомое выражение

Безусловно, команда Grep способна и просто посчитать количество совпадений с заданным выражением:

# ifconfig | grep –c inet6

Указание номера искомой строки в файле

Дополнительный флаг -n для команды grep должен быть хорошо знаком программистам и тестировщикам программного обеспечения. С его помощью можно не только вывести нужные вам строки. Но также и увидеть их номера в указанном файле. Стоит отметить, что нумерация в данном случае ведется с единицы.

# grep –n "main" setup.py

Рекурсивный поиск строки по всем каталогам

Предположим, что вам необходимо найти все вложения указанного выражения в текущем каталоге с его подкаталогами. Для этого достаточно всего лишь добавить флаг -r, запускающий рекурсивный поиск:

# grep –r "function" *

Выведение точного вхождения выражения как отдельного слова

Стоит отметить, что в команде grep предусмотрен специальный флаг -w. Который позволяет найти строку, в которой искомое выражение присутствует в виде отдельного слова:

# ifconfig | grep –w "RUNNING"

С другой стороны, частичное соответствие не будет приводить к выводу того же результата. То есть, следующий пример приведет к иному выводу на экран:

# ifconfig | grep –w "RUN"

Совпадения в архивах Gzip

Gzip (GNU Zip) — это популярное в среде пользователей Linux приложение. Которое предназначено для сжатия и декомпрессии файлов по алгоритму Deflate. К счастью, существует техническая возможность осуществлять поиск по таким сжатым архивам. Прежде всего, для этого нужно воспользоваться командой zgrep. К слову, во всем остальном она действует точно так же, как и обычная команда grep:

# zgrep –i error /var/log/syslog.2.gz

Соответствие более сложному регулярному выражению в файлах

Egrep — это еще одна родственная команда с дополнительными возможностями. В частности, с ее помощью можно вести поиск расширенных глобальных регулярных выражений. В частности, вести поиск можно с использованием метасимволов — +? | или ().

Рекомендуется к прочтению: какая разница между Grep, Egrep и Fgrep в Linux?

Команда egrep незаменима при попытке найти что-то в исходном коде. Стоит отметить, что функции данной команды можно использовать и в обычном варианте grep. Для этого можно воспользоваться флагом -E:

# grep -E

Выявление целой строки, соответствующей выражению

Еще одна производная команда — fgrep — выводит строку целиком, если она полностью соответствует искомому шаблону. Как и в примерах выше, аналогичный результат даст команда grep с флагом -F. При использовании флага -f команда fgrep будет брать искомые шаблоны из заданного файла и искать их в другом файле:

# fgrep –f file_full_of_patterns.txt file_to_search.txt

Выводы

Конечно, возможности команды grep намного шире, чем можно решить, изучив приведенные примеры. Помимо всего прочего, grep может стать основой для написания сложных скриптов (сценариев оболочки) и заданий для cron.