GREP (акроним от «global regular expression print») — одна из самых популярных утилит в операционных системах Linux.
С помощью нее можно не только выполнять поиск фраз (последовательности символов) во множестве файлов одновременно на основе регулярных выражений, но и фильтровать консольный вывод других команд, оставляя только необходимую информацию.
В этом руководстве будет рассмотрен поиск заданных выражений в наборе текстовых файлов различного содержания с помощью утилиты GREP.
Все показанные примеры запускались на облачном сервере Timeweb Cloud под управлением операционной системы Ubuntu версии 22.04.
Облачные серверы
по всему миру с почасовой оплатой.
Схема использования
Схема команды GREP имеет следующий вид:
В этом случае:
- ОПЦИИ. Специальные параметры (флаги), которые активируют те или иные механики работы утилиты, связанные с поиском выражений и выводом результатов.
- ВЫРАЖЕНИЕ. Регулярное выражение (или обычная строка), содержащее фразу (паттерн, шаблон, последовательность символов), которую необходимо найти.
- ИСТОЧНИКИ. Путь к файлам, внутри которых будет выполнять поиск указанного выражения.
Если же команда GREP используется для преобразования вывода другой команды, то ее схема будет выглядеть немного иначе:
Таким образом:
-
КОМАНДА. Произвольная команда с собственным набором параметров, вывод которой необходимо отфильтровать.
При этом символ «|» необходим для образования конвейера (pipeline) выполнения команд, который перенаправляет потоки так, что вывод произвольной команды становится вводом команды GREP.
Подготовка
Понять нюансы работы утилиты GREP лучше всего на небольших примерах по поиску вхождений заданных фраз. Поэтому сперва мы создадим несколько текстовых файлов, а после протестируем на них команду GREP.
Для начала подготовим отдельный каталог, в котором будет выполняться поиск:
После чего создадим первый файл:
Содержимым выступит одно из стихотворений Александра Блока:
Теперь создадим второй файл:
Его содержимым станет простой скрипт на языке Python:
Наконец, создадим третий файл:
На этот раз внутри окажется тривиальная HTML-разметка:
Таким образом с помощью файлов разного формата можно более наглядно разобраться, что делает команда GREP, задействовав всю вариативность функций утилиты.
Регулярные выражения
Регулярные выражения — основа команды GREP. В отличие от обычной строки, регулярные выражения содержат специальные символы, позволяющие задавать фразы с определенной степенью изменчивости.
При использовании утилиты GREP регулярные выражения помещаются в одинарные кавычки:
Таким образом, полная команда может выглядеть так:
Консольный вывод в этом случае будет таким:
Однако использование двойных кавычек позволяет передавать в выражение различные системные данные. Например, можно сперва создать переменную окружения с искомым выражением:
А потом использовать ее в команде GREP:
В дополнение к этому, задействование одинарных косых кавычек (клавиша «Ё» в английской раскладке) позволяет использовать команды подпроцессора bash внутри команды GREP.
Например, можно извлечь регулярное выражение из заранее подготовленного файла:
Обратите внимание, что с помощью символа звездочки (маска) можно указать сразу все файлы, находящиеся в каталоге. Тем не менее, команда GREP не запрещает указание только одного файла:
По той причине, что регулярные выражения являются универсальным языком, используемым во многих операционных системах и языках программирования, их изучение — отдельная обширная тема.
Тем не менее, имеет смысл коротко пройтись по основным специальным символам и их функциям.
При этом важно помнить, что регулярные выражения в Linux могут работать в двух режимах — базовом (Basic Regular Expression, BRE) и расширенном (Extended Regular Expression, ERE).
Расширенный режим активируется с помощью дополнительного флага -E. Разница между обоими режимами в количестве доступных спецсимволов и соответственно широте доступного функционала.
Базовый синтаксис
Базовый синтаксис позволяет задавать лишь общие формальные конструкции, не учитывающие специфику конфигурации их символов.
Начало строки — ^
Символ циркумфлекса указывает, что искомая последовательность символов должна находиться в начале строки:
Консольный вывод будет следующим:
Конец строки — $
Знак доллара указывает, что искомая последовательность символов должна находиться в конце строки:
В консольном терминале появится вот такой вывод:
Обратите внимание, что консольный вывод сохраняет оригинальную запись найденных строк так, как они представлены внутри файлов.
Начало слова — \<
Символы обратной косой черты и знака меньше указывают, что искомая фраза должна находиться в начале слова:
Итогом выполнения этой команды станет следующий консольный вывод:
Конец слова — \>
Символы обратной косой черты и знака больше указывают, что искомая последовательность символов должна находиться в конце слова:
Консольный вывод после выполнения команды будет таким:
Начало или конец слова — \b
Указать начало или конец слова можно с помощью другой более универсальной последовательности символов — обратная косой черты и буквы b.
Например, так указывается начало:
Консольный вывод будет таким:
А так конец:
В этом случае вывод в консольном терминале будет следующим:
Либо можно указать и то, и другое:
В консольном терминале появится нижеследующий вывод:
Произвольный символ — .
Некоторые символы в искомых фразах можно оставить без точного указания с помощью символа точки:
Вывод в терминале консоли окажется таким:
Расширенный синтаксис
Расширенный синтаксис, в отличие от базового, позволяет задавать точное количество символов в искомых фразах, тем самым расширяя спектр возможных совпадений.
Объединение шаблонов — |
Чтобы не выполнять команду GREP несколько раз подряд, можно указать сразу несколько шаблонов в одном регулярном выражении:
Результатом работы этой команды будет комбинированный консольный вывод, содержащий результат поиска двух отдельных регулярных выражений, показанных ранее:
Интервал повторений — {n, d}
В некоторых случаях определенные символы искомой фразы могут количественно отличаться. Поэтому в регулярном выражении можно указать диапазон допустимого количества определенных символов.
Консольный вывод этого вызова будет таким:
Однако часто используемые интервалы повторений удобнее записывать в виде специальных символов, тем самым упрощая внешний вид регулярного выражения.
Одно или более повторений — +
Интервал повторений от одного до бесконечности можно выразить в виде знака сложения:
В этом случае консольный вывод не будет отличаться от предыдущего примера:
Ноль или одно повторение — ?
Интервал повторений от 0 до 1 можно выразить в виде знака вопроса:
В результате выполнения этой команды в консольном терминале появится следующий вывод:
Набор символов — [abc]
Вместо одного конкретного символа можно указать целый набор, обрамленный квадратными скобками:
Консольный вывод в этом случае будет таким:
Диапазон символов — [a-z]
Слишком большой набор допустимых символов можно заменить на диапазон, записанный через тире:
Результатом выполнения этой команды будет следующий вывод:
Более того, наборы и диапазоны символов можно объединять:
Каждый диапазон неявно преобразуется в набор символов:
[a-e]в[abcde][0-6]в[0123456][a-eA-F]в[abcdeABCDEF][A-Fa-e]в[ABCDEFabcde][A-Fa-e0-9]в[ABCDEFabcde0123456789][a-dA-CE-G]в[abcdABCEFG][acegi-l5-9]в[acegijkl56789]
Тип символов — [:alpha:]
Часто используемые диапазоны можно заменить заранее предопределенным типом символов, название которого указывается в квадратных скобках с двоеточием:
|
|
символы от a до z в нижнем регистре |
|
|
символы от A до Z в верхнем регистре |
|
|
символы всех букв |
|
|
символы всех цифр |
|
|
символы всех букв и цифр |
При этом важно понимать, что тип символов — отдельная синтаксическая конструкция. Это значит, что она сама по себе должна быть обрамлена квадратными скобками, обозначающими набор или диапазон символов:
Консольный вывод этой команды будет как показано ниже:
Фильтрация вывода
Чтобы отфильтровать вывод другой команды, после нее необходимо написать символ прямой черты, за которым следует стандартный вызов утилиты GREP, но без указания файлов для поиска:
Консольный вывод, по аналогии с поиском в обычных файлах, будет содержать строки с найденными вхождениями указанных фраз:
В данном случае команда cat извлекает содержимое файла и передает его в поток ввода утилиты GREP.
Опции поиска
Помимо регулярных выражений можно указать дополнительные ключи команды GREP — специальные опции в формате флагов, уточняющие поиск.
Расширенные регулярные выражения (-E)
Активирует режим расширенных регулярных выражений, разрешающий использовать большее количество специальных символов.
Игнорирование регистра (-i)
Выполняет поиск регулярного выражения, не учитывая регистр символов:
Вот такой консольный вывод соответствует этой команде:
При этом флаги можно указывать слитно:
Целое слово (-w)
Выполняет поиск таким образом, чтобы указанное регулярное выражение являлось полноценным словом (а не его подстрокой) в найденной строке:
Обратите внимание, что при указании обычной строки, не содержащий специальные символы, кавычки можно не указывать.
Результатом выполнения этой команды станет вот такой консольный вывод:
Инвертированный поиск (-v)
По умолчанию команда GREP выводит в консольный терминал строки с найденными фразами. Однако результат можно инвертировать, выводя в консольный терминал строки без найденных фраз:
Консольный вывод будет содержать все строки кроме той, в которой было найдено вхождение:
Несколько выражений (-e)
Чтобы не вызывать команду несколько раз, можно сразу указать несколько выражений:
Результат работы этой команды будет идентичен такой записи:
В обоих случаях в консольном терминале появится следующий вывод:
Рекурсивный поиск (-r)
Выполняет рекурсивный поиск в указанной директории до максимальной глубины вложенности:
В консольном терминале появится вывод, содержащий пути файлов, находящихся на разных уровнях вложенности относительно указанной директории:
Поиск специальных символов (-F)
Разрешает использование специальных символов в качестве символов искомой фразы:
Без указания этого флага в консольном терминале возникнет ошибка:
Альтернативой этому флагу будет использование символа экранирования в виде обратной косой черты (\):
Включение файлов (--include)
Позволяет ограничить поиск только указанными файлами:
Консольный вывод будет таким:
Эту команду можно также записать без маски, используя дополнительный флаг рекурсивного поиска.:
Исключение файлов (--exclude)
Избирательно исключает определенные файлы из списка источников поиска:
Консольный вывод окажется следующим:
Опции вывода
Некоторые параметры команды GREP влияют только на вывод результатов поиска, улучшая его информативность и наглядность.
Номера строк (-n)
Для повышения информативности результата работы утилиты GREP можно добавить номера строк, в которых были найдены искомые фразы:
Каждая строка в выводе будет дополнена номером строки
Строки до (-B)
Выводит заданное количество строк, идущих перед строками с найденными вхождениями:
После флага указывается число предыдущих строк, которые требуется вывести в консольный терминал:
Строки после (-A)
Выводит заданное количество строк, идущих после строк с найденными вхождениями:
После флака указывается число последующих строк, которые требуется вывести в консольный терминал:
Строки до и после (-C)
Выводит заданное количество строк, идущих как перед, так и после строк с найденными вхождениями:
После флака указывается число предыдущих и последующих строк, которые требуется вывести в консольный терминал:
Количество строк (-c)
Вместо списка найденных строк команды GREP выводит только их количество:
Консольный вывод будет содержать количество найденных совпадений во всех указанных файлах:
Если же в качестве источника указывается лишь один файл:
То консольный вывод будет содержать только число:
Имена файлов (-l)
Флаг позволяет вывести только названия файлов, в которых найдены совпадения:
В этом случае консольный вывод будет таким:
Ограничение вывода (-m)
Сокращает количество выводящихся в консольный терминал строк до указанного рядом с флагом:
Консольный вывод будет таким:
Как видно, ограничивающее число влияет не на весь вывод в целом, а на строки каждого файла.
Поиск целой строки (-x)
Ищет точное совпадение целой строки без какой-либо вариативности:
Консольный вывод следующий:
Подготовили для вас выгодные тарифы на облачные серверы
477 ₽/мес
657 ₽/мес
Заключение
Команда GREP в Linux — наиболее гибкий и точный инструмент для поиска выражений в больших объемах текстовой информации.
Во время использования команды необходимо указать следующие элементы:
- Специфический набор опций (флагов), настраивающий механизм поиска и вывода результатов.
- Регулярное выражение (одно или несколько), описывающее искомую фразу.
- Список источников (файлы и каталоги), в которых будет выполняться поиск.
Помимо этого утилита используется для фильтрации вывода других команд с помощью перенаправления потоков ввода и вывода.
При этом центральной частью команды GREP являются регулярные выражения. В отличие от обычной строки, они позволяют задать фразу с определенной степенью изменчивости так, чтобы она соответствовала нескольким похожим вхождениям.
Существует два режима работы регулярных выражений:
- Базовый. Ограниченный набор специальных символов, позволяющий формализовывать выражения лишь в общих чертах.
- Расширенный. Полноценный набор специальных символов, позволяющий формализовывать выражения с точностью до каждого символа.
Расширенный режим предоставляет полную гибкость и точность при работе с регулярными выражениями.
Лишь в редких случаях, когда требуется найти только вхождения тривиальных паттернов, можно ограничиться базовым режимом.
