Команда grep в Linux

Команда 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

 

В результате на экран будут выведены строки, полностью совпадающие в обоих файлах. Подобный прием особенно полезен при работе с объемными файлами настроек, файлами журналов (логами) и т.п.


источник



Report Page