Команда grep (сокращение от Global Regular Expressions Print) - это мощный инструмент обработки текста для поиска по файлам и каталогам. Когда grep сочетается с regex (регулярными выражениями), расширенный поиск и фильтрация вывода становятся простыми. Системные администраторы, разработчики и обычные пользователи выигрывают от освоения regex с помощью команды grep.
Это руководство на примерах научит вас использовать команду grep с regex.
Необходимые условия
- Доступ к терминалу/командной строке.
- Текстовый файл для поиска. В примерах используется файл .bashrc.
Регулярные выражения команды grep
Синтаксис команды grep включает регулярные выражения в следующем формате:
1 | grep [regex] [file] |
Регулярные выражения - это простые утверждения, которые помогают фильтровать данные и файлы. Многие команды Linux, такие как команда awk или sed, также используют регулярные выражения для поиска и работы с информацией.
Два общих типа символов составляют оператор regex:
- Литералы, которые являются стандартными текстовыми символами.
- Специальные символы или метасимволы имеют специальное значение, если они не экранированы обратной косой чертой (\).
Заключайте выражения regex в одинарные кавычки и экранируйте символы, чтобы избежать интерпретации оболочкой.
Команда grep предлагает три варианта синтаксиса regex:
- Базовое регулярное выражение (BRE)
- Расширенные регулярные выражения (ERE)
- Перл-совместимые регулярные выражения (PCRE)
По умолчанию grep использует синтаксис BRE.
Пример регекса Grep
Выполните следующую команду, чтобы проверить, как работает grep regex:
1 | grep if .bashrc |
Регекс ищет строку символов. Результат показывает все случаи, когда в файле .bashrc за буквой i следует буква f. Таким образом, на выходе получаются следующие результаты:
- if
- elif
- notify
- identifying
Команда возвращает только те строки, в которых есть совпадение.
Как использовать Regex в Grep
Regex предлагает множество возможностей для уточнения поиска с помощью grep. Ниже приведены некоторые общие примеры, объясняющие основной синтаксис и логику. Комбинируйте совпадения для создания сложных регексов.
Буквальные соответствия
Буквенные соответствия обеспечивают точное совпадение для указанной строки символов. Предыдущий пример выражения if демонстрирует буквенное соответствие.
Поиск чувствителен к регистру. Следующая команда дает результаты, отличные от предыдущего примера:
1 | grep If .bashrc |
Добавьте опцию -i или --ignore-case для поиска всех возможных комбинаций регистров.
Для поиска нескольких слов добавьте кавычки:
1 | grep "if the" .bashrc |
Если опустить кавычки, второе слово будет рассматриваться как файл или местоположение.
Якорные совпадения
Якорные совпадения определяют местоположение строки в поиске. Существует два типа якорей:
- Знак каретки (^) ищет строки, начинающиеся с указанного выражения.
- Знак доллара ($) ищет строки, заканчивающиеся указанным выражением.
Например, чтобы найти строки, начинающиеся со слова alias в файле .bashrc, используйте:
1 | grep ^alias .bashrc |
Поиск не отображает строки с табуляцией или пробелами перед словом.
Чтобы найти строки, заканчивающиеся словом then в файле .bashrc, выполните следующее:
1 | grep then$ .bashrc |
Используйте оба якоря для создания оператора regex, который ищет одно слово или утверждение в строке:
1 | grep ^esac$ .bashrc |
Используйте только якоря, чтобы найти пустые строки в файле. Добавьте опцию -n, чтобы показать номера строк в выводе:
1 | grep -n ^$ .bashrc |
Без опции -n вывод будет пустым.
Соответствие любому символу
Метасимвол регекса точка (.) соответствует любому символу вместо знака. Например:
1 | grep r.o .bashrc |
Вывод покажет все случаи использования буквы r, за которой следует любой символ, а затем o. Точка может быть любым символом, например, буквой, цифрой, знаком или пробелом.
Добавьте несколько точек, чтобы указать несколько символов:
1 | grep r..t .bashrc |
Для создания сложного оператора regex используйте сочетание с сопоставлением якорей. Например:
1 | grep ..t$ .bashrc |
Этот оператор находит все строки с любыми двумя символами, за которыми в конце следует буква t.
Выражения со скобками
Выражения со скобками позволяют сопоставить несколько символов или диапазон символов в одной позиции. Например, чтобы найти все строки, содержащие и или end в файле .bashrc, используйте следующий шаблон:
1 | grep [ae]nd .bashrc |
Выражения со скобками позволяют исключать символы путем добавления знака каретки (^). Например, чтобы найти все символы, кроме and или end, используйте:
1 | grep [^ae]nd .bashrc |
Используйте выражения со скобками, чтобы указать диапазон символов, добавляя дефис (-) между первой и последней буквой. Например, поиск всех случаев заглавных букв:
1 | grep [A-Z] .bashrc |
Комбинируйте выражения со скобками с сопоставлением якорей, чтобы найти все слова, начинающиеся с заглавных букв:
1 | grep ^[A-Z] .bashrc |
Скобочные выражения позволяют использовать несколько диапазонов. Например, для поиска всех небуквенных символов используйте:
1 | grep [^a-zA-Z] .bashrc |
Вывод выделяет числа и символы, игнорируя все буквы.
Классы символов
Grep предлагает стандартные классы символов в качестве предопределенных функций для упрощения скобочных выражений. Ниже приведена таблица, в которой описаны некоторые классы и эквиваленты скобочных выражений.
Синтаксис | Описание | Эквивалент |
[[:alnum:]] | Все буквы и цифры. | "[0-9a-zA-Z]" |
[[:alpha:]] | Все буквы. | "[a-zA-Z]" |
[[:blank:]] | Пробелы и табуляции. | [CTRL+V<TAB> ] |
[[:digit:]] | Цифры от 0 до 9. | [0-9] |
[[:lower:]] | Строчные буквы. | [a-z] |
[[:punct:]] | Пунктуация и другие знаки. | "[^a-zA-Z0-9]" |
[[:upper:]] | Прописные буквы. | [A-Z] |
[[:xdigit:]] | Шестнадцатеричные цифры. | "[0-9a-fA-F]" |
Квантификаторы
Квантификаторы - это метасимволы, которые указывают количество появлений. В следующей таблице показан синтаксис квантификатора grep с кратким описанием.
Синтаксис | Описание |
* | Ноль или более совпадений. |
? | Ноль или одно совпадение. |
+ | Одно или несколько совпадений. |
{n} | n совпадений. |
{n,} | n или более совпадений. |
{,m} | До m совпадений. |
{n,m} | От n до m совпадений. |
Знак * соответствует шаблону ноль или более раз. Чтобы продемонстрировать это, выполните следующую команду:
1 | grep m*and .bashrc |
В данном случае знак * совпадает с буквой m ноль или более раз. Поэтому "and, mand, mmand" - это все совпадения. Буква m повторяется любое количество раз, когда за ней следует знак *.
Чтобы найти нулевое или ровно одно совпадение, используйте знак ? Заключите утверждение в одинарные кавычки и экранируйте символ, чтобы избежать интерпретации. Например:
1 | grep 'm\?and' .bashrc |
В качестве альтернативы используйте расширенные регулярные выражения, чтобы избежать экранирования:
1 | grep -E 'm?and' .bashrc |
Вывод выделяет все случаи использования and или mand.
Используйте квантификаторы диапазона, чтобы указать точное количество повторений. Например, поиск строк с двумя гласными:
1 | grep '[aeiouAEIOU]\{2\}' .bashrc |
1 | grep -E '[aeiouAEIOU]{2}' .bashrc |
Вывод выделяет все слова с двумя гласными.
Альтернатива
Альтернатива позволяет определять альтернативные соответствия. Заключите альтернативные строки в одинарные кавычки и отделите каждую из них символом трубы (\|).
Например, для поиска слов bash или alias в файле .bashrc используйте:
1 | grep 'bash\|alias' .bashrc |
В качестве альтернативы используйте расширенный regex и опустите управляющий символ:
1 | grep -E 'bash|alias' .bashrc |
В результате будут выделены оба экземпляра строк в файле.
Группировка
Регулярные выражения позволяют группировать шаблоны в один элемент. Поместите группу в скобки для регулярного regex или используйте расширенный.
Например, выполните поиск строки bashrc, а символы rc сделайте необязательными:
1 | grep 'bash\(rc\)\?' .bashrc |
1 | grep -E 'bash(rc)?' .bashrc |
Вывод выделяет все экземпляры bashrc. Поскольку rc не является обязательным, команда также соответствует слову bash.
Специальные выражения обратной косой черты
Команда grep предлагает несколько уникальных выражений обратной косой черты для расширенного сопоставления границ слов. Ниже приведена таблица с краткими примерами для каждого типа выражения.
Синтаксис | Пример | Соответствия (Жирным шрифтом выделены совпадения) |
\b | '\band\b' | and "and" \and\ <space>and <tab>and |
\B | '\Band' | _and _and_ sand handy |
\< | '\<and' | and "and" andy and_ <space>and <tab>and |
\> | 'and\>' | and "and" sand _and <space>and <tab>and |
\w | '\wand' | _and _and_ handy sand |
\W | '\Wand' | "and" /and/ |
\s | '\sand' | <space>and <tab>and |
\S | '\Sand' | _and "and" sand handy _and_ /and/ |
Например, используйте границы \b, чтобы найти слово, которое не является частью другого слова:
1 | grep '\bse[et]\b'</code> .bashrc |
Выражение определяет местоположение слов see и set. Граница обеспечивает изоляцию слов.
Экранирование мета-символов
Экранирование мета-символов рассматривает специальные символы как литералы. Например, чтобы найти точку (.) в конце строки, экранируйте мета-символ:
1 | grep '\.$' .bashrc |
Запрет на интерпретацию символов помогает при поиске в исходном коде или конфигурационных файлах.
Заключение
Проработав примеры в этом руководстве, вы освоили операторы grep regex. Поиск в файлах и каталогах с помощью grep regex помогает уточнить поисковую выдачу в соответствии с конкретным случаем использования.