О grep для начинающих

Alexander Shepetko17 сентября 2010, 00:00 32 0

Простая, эффективная и обязательная к изучению утилита для всех, кто администрирует UNIX-подобные ОС.

Если вы какое-то время используете Linux, то наверняка слышали о grep, хотя могли и не использовать её никогда в работе. GNU grep умеет выполнять поиск по шаблону в текстовых файлах или стандартном потоке вывода. Простая, эффективная и, поверьте автору, обязательная к изучению, если вы администрируете UNIX-подобную ОС. Хотите освоить grep? Давайте начнём прямо сейчас!

Как искать?

В своей основе grep предельно прост. Если вам нужно поискать что-то по шаблону в файле, воспользуйтесь командой:

grep шаблон путь_к_файлу

Эта команда выполнит поиск по шаблону в указанном файле и выведет в стандартный поток вывода строки файла, искомый шаблон содержащие.

grep — удобная утилита во многих отношениях. Один из очевидных вариантов использования — быстрый поиск в текстовых файлах. Вы можете легко и быстро находить нужное в лог-файлах и файлах конфигурации.

Существует также очень распространённое применение grep — фильтрация потока вывода других программ. Давайте представим, например, что вам нужно получить список всех файлов, которые устанавливаются из пакета в каталог /usr/bin. В Debian-системах попробуйте команду:

dpkg-query -L packagename | grep "/usr/bin"

Для систем с RPM команда будет выглядеть так:

rpm -q --filesbypkg packagename | grep "/usr/bin"

Таким образом, вместо вывода полного списка всех файлов пакета, вы получите только те, которые предназначены для установки в каталог /usr/bin. Вы можете пойти дальше, и при помощи следующего перенаправления в grep, сузить результаты фильтрации.

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

Выполняя поиск в файлах, grep умеет работать рекурсивно. Чтобы заставить grep работать таким образом, используйте опцию -r. А по умолчанию grep будет искать только в файлах, находящихся в текущем каталоге. Таким образом, если вы запустите что-то вроде

grep шаблон *

то grep будет искать только в файлах, находящихся в текущем каталоге, находясь в котором вы запустили команду.

Но если вы запустите

grep -r шаблон *

то grep заботливо обойдёт все вложенные подкаталоги и поищет шаблон в файлах найденных подкаталогов.

Поиск наоборот

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

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

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

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

grep -v -l pattern *

Вам не нужны имена файлов в выводе grep, а интересны лишь строки — воспользуйтесь опцией -h и grep не будет выводить имена файлов.

По умолчанию grep выполняет «жадный» поиск. То есть, она захватывает не только часть строки, соответствующую шаблону, но и всё после неё. Например, если вы ищете «Beat», то grep будет считать соответствием и «Beatles», «Beaten», «Beats» и любую строку, содержащую «Beat». Такое поведение grep на практике нечасто пригождается и вы можете ограничить его при помощи опции -w. С этой опцией grep будет отбирать соответствия в пределах слова.

Контекст

В процессе поиска по лог-файлам часто нужно увидеть, в каком контексте найдено то или иное. По умолчанию grep выводит лишь строку, в которой было найдено совпадение, но есть несколько опций, позволяющих заставить grep выводить больше: -A (после контекста), -B (перед контекстом) и -C (контекст).

Используя эти опции, необходимо указать саму опцию и целое число, определяющее количество строк для вывода. Например

grep -C 2 pattern files

выведет строки, в которых найдено соответствие, плюс 2 строки до 2 после каждой найденной.

Регулярные выражения

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

Давайте немного рассмотрим регулярные выражения, которые вероятно, вам пригодятся. В командной оболочке символ звёздочки * соответствует любому символу ноль или более раз. В grep символ * имеет несколько иное значение. Здесь этот символ необходимо группировать с другими. Например, если вам нужен тот же эффект, как и в оболочке, используйте следующее:

grep '.*' pattern files

Если вам необходимо определить какой-то шаблон один и более раз, вы можете использовать конструкцию +шаблон.

Символ ^ соответствует началу строки, а символ $ — её концу. Например, вы хотите найти все файлы с расширением .html, но вам не нужны файлы с расширением .html.bak:

ls | grep '.*html$'

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

grep '\*' filename

будет искать строки, содержащие символ звёздочки в filename.

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

grep '[[:punct:]]$' files

Обратите внимание на двойные скобки. Вообще, об использовании регулярных выражений в grep лучше всего проконсультируйтесь с её man-страницей. Поначалу, понимание того, что написано там, может даваться вам с некоторым трудом, однако не поленитесь, и вы сможете овладеть мощным инструментом — регулярными выражениями.

Цвет

Зачастую в выводе grep трудновато бывает сразу же отыскать соответствующую шаблону часть строки. Чтобы упростить задачу визуального поиска среди результатов выдачи grep, вы можете попросить её использовать цвет для отметки совпадений. Просто добавьте опцию --color=always или --color=auto.

Обратите внимание, что в некоторых дистрибутивах разработчики создают псевдоним для grep, включающий цвет по умолчанию. Например, в Linux Mint команда grep имеет псевдоним grep --color=auto. Если у вас похожая ситуация, то используйте команду grep --color=off в случаях, когда вам не нужен цветной вывод.

С цветом или без, grep — утилита, без которой себе не представляют жизни ни «продвинутые пользователи», ни системные администраторы. Конечно, рядовым пользователям десктопов знание этой утилиты может оказаться вовсе ни к чему, хотя и не будет большого вреда, если они с ней познакомятся. Но если же вы собираетесь работать в Linux на более высоком уровне, то grep — это одна из первых вещей, которые вам стоит освоить.