12 практических примеров команды grep в Linux
Возможно, у вас уже возникала ранее необходимость найти в файлах заданный набор текста (строку или шаблон). Специально для решения подобной задачи существует такая интересная команда, как команда 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.