Утилита grep в ОС Linux

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

Если вы нашли ошибку, пожалуйста, выделите фрагмент текста и нажмите Ctrl+Enter.

Понравилась статья? Поделиться с друзьями:
Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!:

ИТ Проффи

Сообщить об опечатке

Текст, который будет отправлен нашим редакторам: