Команда grep (Global Regular Expression Print – глобальный поиск по регулярному выражению с печатью результатов) выполняет построчный анализ текста и выводит строки, соответствующие заданному шаблону.
Синтаксис
grep [ОПЦИИ] ШАБЛОН [ФАЙЛ]
Ниже предоставлены основные опции утилиты.
-b — показывать номер блока перед строкой
-c — Отключает стандартный способ вывода результата и вместо этого отображает только число обозначающее количество найденых строк.
-h — не выводить имя файла в результатах поиска внутри файлов Linux
-i — не учитывать регистр
-l — отобразить только имена файлов, в которых найден шаблон
-n — показывать номер строки в файле
-s — не показывать сообщения об ошибках
-v — инвертировать поиск, выдавать все строки кроме тех, что содержат шаблон
-w — Ведет поиск по цельным словам. Например при обычном поиске строки ‘wood’ grep может найти слово ‘hollywood’. А если используется данный ключ то будут найдены только строки где есть слово ‘wood’
-e — использовать регулярные выражения при поиске
-An — показать вхождение и n строк до него
-Bn — показать вхождение и n строк после него
-Cn — показать n строк до и после вхождения
-o — показать только совпадающие (непустые) части совпадающей строки, каждая из которых находится в отдельной строке.
-P — Интерпретировать шаблон как регулярное выражение Perl. Это экспериментально, и grep -P может предупредить о невыполненных функции.
-r — Производит поиск рекурсивно по всем поддиректориям.
Обзор
grep выполняет поиск соответствий регулярному выражению (ШАБЛОН) по тексту в файле, нескольких файлах или потоке ввода (если имя не указано или вместо него указан один минус («-»). Найденные совпадения выводятся на терминал.
Пример использования
Допустим, требуется быстро найти фразу «our products» в HTML-файлах на компьютере. Начнем с поиска в одном из них. В данном случае ШАБЛОН – это «our products», а ФАЙЛ – product-listing.html
$ grep "our products" product-listing.html <p>You will find that all of our products are impeccably designed and meet the highest manufacturing standards available <em>anywhere. </em> </p> $
Была найдена одна строка, содержащая указанный шаблон, и grep выводит всю соответствующую строку на терминал. Строка длиннее ширины окна терминала, поэтому текст переносится на следующие строки, но данный вывод соответствует ровно одной строке в файле.
Важно: ШАБЛОН интерпретируется grep как регулярное выражение. В рассмотренном выше примере все использованные символы (буквы и пробел) интерпретируются в регулярных выражениях буквально, поэтому выполняется только поиск точной фразы. Однако, у других символов, например, некоторых знаков препинания, может быть особое значение.
Выделение цветом
При использовании опции –color найденные совпадения будут выделены цветом:
$ grep –-color "bla bla" listing.txt
You will find that all of bla bla are impeccably designed and meet the highest manufacturing standards available
$
Просмотр номеров строк, содержащих совпадения
Еще полезнее может быть информация о месторасположении строки с совпадением в файле. Если указать опцию –n, grep перед каждой содержащей совпадение строкой будет выводить ее номер в файле:
$ grep –-color -n "bla bla" listing.txt
18:You will find that all of bla bla are impeccably designed and meet the highest manufacturing standards available
Перед содержащей соответствие строкой выведено «18:», что соответствует 18-й строке.
Выполнение поиска без учета регистра
Допустим, фраза «string search» расположена в начале предложения или набрана в верхнем регистре. Для поиска без учета регистра можно указать опцию –i:
$ grep –-color –n -i "string search" listing.txt 18:<p>You will find that all of string search are impeccably designed and meet the highest manufacturing standards available <em>anywhere. </em> </p> 23:<p class="listing">String search are manufactured using only the finest top-grain leather.</p> $
С опцией -i grep находит также совпадение в строке 23.
Поиск в нескольких файлах по маске
Для поиска в нескольких файлах можно использовать маску в аргументе . Например, вместо имени файла listing.txt можно указать звездочку («*») и расширение .txt. При выполнении команды оболочка будет распространять звездочку на все имена файлов (в текущей директории) с расширением «.txt».
$ grep –-color –n -i "tu tu" *.txt product-details.txt:27:<p><b>TU TU</b></p> product-details.txt:59:<p class=”products-searchbox”>To search a comprehensive list of tu tu type your search term in the box below and click the magnifying glass</p> product-listing.txt:18:<p>You will find that all of tu tu are impeccably designed and meet the highest manufacturing standards available <em>anywhere. </em> </p> product-listing.txt:23:<p class="listing">Tu tu are manufactured using only the finest top-grain leather.</p> product-overview.txt:30:<p>To learn more about tu tu please email us at the link below.</p> $
В начале каждой строки указано имя файла, содержащего совпадение.
Рекурсивный поиск по поддиректориям
Поиск можно расширить по поддиректориям и всем файлам, которые они содержат, при помощи опции –r, которая предписывает grep выполнять поиск рекурсивно. Заменим наш аргумент на одну звездочку («*»), чтобы поиск выполнялся не только по TXT-файлам, а по всем файлам и директориям:
$ grep –-color –n –i -r "string search" * product-details.html:27:<p><b>STRING SEARCH</b></p> xml/dynamic-content.xml:29:<page01 ref=”prods_01_a” ref coord=”83,12,17”<![CDATA[<p>Click here to email us about string search.</p>]]></ page01> $
В результате мы нашли еще три совпадения. Для содержащих совпадения файлов вне текущей директории выводится также имя директории.
Использование регулярных выражений
Истинная сила grep заключается в возможности применения для поиска соответствий регулярным выражениям. В регулярных выражениях в аргументе ШАБЛОН используются специальные символы для охвата более широкого диапазона строк. Рассмотрим простой пример.
Допустим, требуется найти каждое появление фразы, похожей на «our products», которая всегда должна начинаться с «our» и заканчиваться на «products». Для этого нужно указать такой шаблон: «our.*products».
В регулярных выражениях точка («.») интерпретируется как маска для одного символа. Она означает «подойдет любой символ на этом месте». Звездочка («*») означает «подойдет предыдущий символ в количестве от нуля и более». Таким образом, комбинация «.*» означает, что подойдет любой символ в любом количестве. Например, «our amazing products», «ours, the best-ever products» и даже «ourproducts» будут соответствовать выражению. А так как указана опция –i, ему будут соответствовать также «OUR PRODUCTS» и «OuRpRoDuCtS». При запуске команды с этим регулярным выражением мы получим дополнительные совпадения:
$ grep –-color –n -i «our.*products» *.html product-details.html:27:<p><b>OUR PRODUCTS</b></p> product-details.html:59:<p class=”products-searchbox”>To search a comprehensive list of our products type your search term in the box below and click the magnifying glass</p> product-replacement.html:58:<p>If you experience dissatisfaction with any of our fine products, do not hesitate to contact us using the form below.</p> $
Была найдена фраза «our fine products».
Grep – мощный инструмент работы с текстовыми файлами. При умелом использовании регулярных выражений он предоставляет еще более широкие возможности. Здесь рассмотрены наиболее типичные примеры использования команды. Другие опции командной строки можно узнать, запустив команду с опцией —help.