Вероятно, практически каждому, кто пользуется командной строкой в 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, у которой есть и русскоязычный перевод.
Советуем также обратить внимание на man-страницу grep, у которой есть и русскоязычный перевод.
Комментариев нет:
Отправить комментарий
Примечание. Отправлять комментарии могут только участники этого блога.