Просто о grep: мощном инструменте поиска в Linux

Вероятно, практически каждому, кто пользуется командной строкой в Linux, приходилось использовать утилиту grep, которая используется для поиска и вывода строк, соответствующих условиям поиска в  файлах или стандартном потоке вывода. Название представляет собой акроним английской фразы «search globally for lines matching the regular expression, and print them» — «искать везде строки, соответствующие регулярному выражению, и выводить их».
Не смотря на то, что это весьма мощный инструмент, начинающие пользователи редко  используют его в ином виде, нежели grep строка_поиска.
Весьма кстати попалась на глаза статья блоггера ashep, взяв которую за основу, я подготовлю свой «конспект» для использования этой утилиты  (удалив мало востребованное, и добавив необходимое), который, надеюсь, пригодится многим.

Самое простое применение: 
grep строка_поиска(регулярное выражение) файл_поиска
Как было упомянуто выше, grep может искать и в стандартном потоке вывода, поэтому аналогичное  действие выполнит и приведенная ниже команда:

 cat  файл_поиска | grep строка_поиска(регулярное выражение)

При этом вместо cat  файл_поиска может быть результат вывода любой другой команды. Так, например, чтобы получить список всех файлов, которые устанавливаются из пакета в каталог /usr/bin в Ubuntu можно так:

dpkg-query -L packagename | grep «/usr/bin»

Как и всё в UNIX, grep по умолчанию чувствителен в регистру символов. Если вам это не подходит, просто добавьте опцию -i к вызову grep, после чего строки «ПОИСК» и  «поиск» станут для неё равнозначными.

 Для поиска внутри каталогов используйте ключ -r . Например:

grep -r строка_поиска(регулярное выражение) *.txt

Что, если вы хотите найти всё, кроме чего-то? grep умеет и это тоже. Используйте опцию -v и grep будет выводить только те строки, которые не соответствуют шаблону.

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

grep -v -l строка_поиска *

Вам не нужны имена файлов в выводе grep, а интересны лишь строки — воспользуйтесь опцией -h и grep не будет выводить имена файлов.
Для «статистических»  нужд могут пригодиться опции -c и -n
Так, с опцией -с  grep выдает только количество строк, содержащих образец, а с -n выдает перед каждой строкой ее номер в файле (строки нумеруются с 1).
По умолчанию grep выполняет «жадный» поиск. То есть, она захватывает не только часть строки, соответствующую шаблону, но и всё после неё. Например, если вы ищете «Beat», то grep будет считать соответствием и «Beatles», «Beaten», «Beats» и любую строку, содержащую «Beat». Вы можете строго ограничить поиск при помощи опции «-w». С этой опцией grep будет отбирать соответствия в пределах слова.
В процессе поиска по иногда нужно увидеть, в каком контексте найдено то или иное. По умолчанию grep выводит лишь строку, в которой было найдено совпадение, но есть несколько опций, позволяющих заставить grep выводить больше: -A (после контекста),  -B (перед контекстом) и -C (контекст).
Используя эти опции, необходимо указать саму опцию и целое число, определяющее количество строк для вывода. Например

grep -C 2 строка_поиска(регулярное выражение) файл_поиска

выведет строки, в которых найдено соответствие, плюс 2 строки до 2 после каждой найденной.
 Регулярные выражения в grep
grep может оказаться мало востребованной, если при помощи неё искать лишь какие-то конкретные последовательности символов.  А как быть с тем, если вам нужно найти, например, только цифры или последовательность символов, в которую могут входить лишь определённые символы или их группы? Не проблема! Используя регулярные выражения в grep, вы получаете инструмент практически для любой задачи поиска.
В командной оболочке символ звёздочки «*» соответствует любому символу ноль или более раз. В grep символ «*» имеет несколько иное значение. В grep этот символ необходимо группировать с другими. Например, если вам нужен тот же эффект, как и в оболочке, используйте следующее:

grep .* строка_поиска(регулярное выражение) файл_поиска

Если вам необходимо определить какой-то шаблон один и более раз, вы можете использовать конструкцию «+шаблон».
Символ «^» соответствует началу строки, а символ «$» — её концу. 
Например, вы хотите найти все файлы с расширением «.html», но вам не нужны файлы с расширением «.html.bak»:

ls | grep .*html$

Если вам необходимо, чтобы grep интерпретировала спецсивмолы как обычные — предварите их обратным слешем или заключите в одинарные кавычки. Например

grep ‘*’ имя_файла

будет искать строки, содержащие символ звёздочки в файле.
В выражениях можно использовать диапазоны и классы символов. Для этого при составлении шаблона в grep используются квадратные скобки. 
Например, символу в диапазоне от A до Z будет соответствовать шаблон [A-Z]»», а любой цифре — [0-9]»». Также, используя квадратные скобки вы можете определять соответствие классам символов. Например, [:punct:]»» будет соответствовать любому знаку препинания. Например, чтобы найти строки, содержащие знаки препинания в конце, можно использовать следующую команду:
grep '[[:punct:]]$' файлы 
Обратите внимание на двойные скобки.

Советуем также обратить внимание на man-страницу grep, у которой есть и русскоязычный перевод

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *