Регулярные выражения в Grep (Regex)

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

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

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

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

Регулярное выражение (regular expression) — это шаблон, соответствующий набору строк. Шаблон состоит из операторов, литеральных символов и метасимволов, имеющих особое значение. GNU grep поддерживает три синтаксиса регулярных выражений: базовый, расширенный и совместимый с Perl.

В простейшем случае, когда тип регулярного выражения не указан, grep интерпретирует шаблоны поиска как базовые регулярные выражения. Чтобы интерпретировать шаблон как расширенное регулярное выражение, используйте опцию -E (или --extended-regexp ).

В реализации grep в GNU нет функциональной разницы между базовым и расширенным синтаксисами регулярных выражений. Единственное отличие заключается в том, что в базовых регулярных выражениях метасимволы ? , + , { , | , ( и ) интерпретируются как литеральные символы. Чтобы сохранить особое значение метасимволов при использовании базовых регулярных выражений, их необходимо экранировать обратной косой чертой ( ). Мы объясним значение этих и других метасимволов позже.

Как правило, регулярное выражение всегда следует заключать в одинарные кавычки, чтобы избежать интерпретации и расширения метасимволов оболочкой.

Буквальные совпадения

Наиболее простое применение команды grep — поиск символа или последовательности символов в файле. Например, чтобы отобразить все строки, содержащие строку «bash» в файле /etc/passwd , выполните следующую команду:

 grep bash /etc/passwd

Вывод должен выглядеть примерно так:

 root:x:0:0:root:/root:/bin/bash linuxize:x:1000:1000:linuxize:/home/linuxize:/bin/bash

В этом примере строка «bash» — это простое регулярное выражение, состоящее из четырёх литеральных символов. Это указывает grep искать строку, содержащую «b», за которой сразу следуют «a», «s» и «h».

По умолчанию команда grep чувствительна к регистру. Это означает, что заглавные и строчные символы воспринимаются как отдельные.

Чтобы игнорировать регистр при поиске, используйте опцию -i (или --ignore-case ).

Важно отметить, что grep ищет шаблон поиска как строку, а не как отдельное слово. Поэтому, если вы ищете «gnu», grep также выведет строки, где «gnu» встречается в более длинных словах, таких как «cygnus» или «magnum».

Если строка поиска содержит пробелы, ее необходимо заключить в одинарные или двойные кавычки:

 grep "Gnome Display Manager" /etc/passwd

Якорная стоянка

Якоря — это метасимволы, которые позволяют указать, в каком месте строки следует искать совпадение.

Символ ^ (крышка) соответствует пустой строке в начале строки. В следующем примере строка «linux» будет найдена только в самом начале строки.

 grep '^linux' file.txt

Символ $ (доллар) соответствует пустой строке в начале строки. Чтобы найти строку, заканчивающуюся на «linux», используйте:

 grep 'linux$' file.txt

Вы также можете создать регулярное выражение, используя оба якоря. Например, чтобы найти строки, содержащие только «linux», выполните:

 grep '^linux$' file.txt

Еще один полезный пример — шаблон ^$ , который соответствует всем пустым строкам.

Соответствие одного символа

Символ . (точка) — это метасимвол, соответствующий любому одиночному символу. Например, чтобы найти любой текст, начинающийся с «kan», состоящий из двух символов и заканчивающийся строкой «roo», используйте следующий шаблон:

 grep 'kan..roo' file.txt

Выражения в скобках

Выражения со скобками позволяют найти группу символов, заключив их в квадратные скобки [] . Например, чтобы найти строки, содержащие «accept» или «accent», можно использовать следующее выражение:

 grep 'acce[np]t' file.txt

Если первый символ в скобках — символ ^ , то он соответствует любому отдельному символу, не заключенному в скобки. Следующий шаблон будет соответствовать любой комбинации строк, начинающихся с «co», за которой следует любая буква, кроме «l», за которой следует «la», например, «coca», «cobalt» и так далее, но не будет соответствовать строкам, содержащим «cola».

 grep 'co[^l]a' file.txt

Вместо того, чтобы вводить символы по одному, можно указать диапазон символов в скобках. Выражение диапазона формируется путём указания первого и последнего символов диапазона, разделённых дефисом. Например, [aa] эквивалентно [abcde] , а [1-3] эквивалентно [123] .

Следующее выражение соответствует каждой строке, начинающейся с заглавной буквы:

 grep '^[AZ]' file.txt

grep также поддерживает предопределённые классы символов, заключённые в скобки. В следующей таблице представлены некоторые из наиболее распространённых классов символов:

Квантификатор Классы персонажей
[:alnum:] Буквенно-цифровые символы.
[:alpha:] Буквенные символы.
[:blank:] Пробел и табуляция.
[:digit:] Цифры.
[:lower:] Строчные буквы.
[:upper:] Заглавные буквы.

Полный список всех классов символов смотрите в руководстве Grep .

Квантификаторы

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

Квантификатор Описание
* Сопоставление с предыдущим элементом ноль или более раз.
? Совпадение с предыдущим элементом ноль или один раз.
+ Найдите соответствие предыдущему элементу один или несколько раз.
{n} Совпадите с предыдущим элементом ровно n раз.
{n,} Найдите соответствие предыдущему элементу не менее n раз.
{,m} Сопоставьте предыдущий элемент не более m раз.
{n,m} Сопоставьте предыдущий элемент от n до m раз.

Символ * (звёздочка) соответствует предыдущему элементу ноль или более раз. Следующий символ будет соответствовать «right», «sright», «ssright» и так далее:

 grep 's*right'

Ниже представлен более сложный шаблон, который соответствует всем строкам, начинающимся с заглавной буквы и заканчивающимся точкой или запятой. Регулярное выражение .* соответствует любому количеству любых символов:

 grep -E '^[AZ].*[.,]$' file.txt

Символ ? (вопросительный знак) делает предыдущий элемент необязательным, и он может совпасть только один раз. Следующий пример будет соответствовать как «bright», так и «right». Символ ? экранирован обратной косой чертой, поскольку мы используем базовые регулярные выражения:

 grep 'b?right' file.txt

Вот то же регулярное выражение, использующее расширенное регулярное выражение:

 grep -E 'b?right' file.txt

Символ + (плюс) соответствует предыдущему элементу один или несколько раз. Следующий пример будет соответствовать «sright» и «ssright», но не «right»:

 grep -E 's+right' file.txt

Фигурные скобки {} позволяют указать точное число, верхнюю или нижнюю границу или диапазон вхождений, которые должны произойти для обнаружения совпадения.

Следующий пример соответствует всем целым числам, содержащим от 3 до 9 цифр:

 grep -E '[[:digit:]]{3,9}' file.txt

Номер

Термин «альтернирование» представляет собой простое «ИЛИ». Оператор чередования | (вертикальная черта) позволяет указать различные возможные соответствия, которые могут быть как строковыми литералами, так и наборами выражений. Этот оператор имеет самый низкий приоритет среди всех операторов регулярных выражений.

В примере ниже мы ищем все вхождения слов fatal , error и critical в файле ошибок журнала Nginx :

 grep 'fatal|error|critical' /var/log/nginx/error.log

Если вы используете расширенное регулярное выражение, то оператор | не следует экранировать, как показано ниже:

 grep -E 'fatal|error|critical' /var/log/nginx/error.log

Группировка

Группировка — это функция регулярных выражений, которая позволяет объединять шаблоны и ссылаться на них как на один элемент. Группы создаются с помощью скобок () .

При использовании основных регулярных выражений скобки необходимо экранировать обратной косой чертой ( ).

Следующий пример соответствует как словам «fearless», так и «less». Квантификатор ? делает группу (fear) необязательной:

 grep -E '(fear)?less' file.txt

Специальные выражения с обратной косой чертой

Команда GNU grep включает несколько метасимволов, состоящих из обратной косой черты и обычного символа. В следующей таблице представлены некоторые наиболее распространённые специальные выражения с обратной косой чертой:

Выражение Описание
b Сопоставьте границу слова.
< Сопоставьте пустую строку в начале слова.
> Сопоставьте пустую строку в конце слова.
w Найдите слово.
s Сопоставьте пробел.

Следующий шаблон будет соответствовать отдельным словам «abject» и «object». Он не будет соответствовать этим словам, если они встроены в более крупные слова:

 grep 'b[ao]bjectb' file.txt

Заключение

Регулярные выражения используются в текстовых редакторах, языках программирования и инструментах командной строки, таких как grep , sed и awk . Умение составлять регулярные выражения может быть очень полезно при поиске в текстовых файлах, написании скриптов или фильтрации вывода команд.

Если у вас есть вопросы или пожелания, не стесняйтесь оставлять комментарии.

grep- терминал

Связанные руководства

Источник

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

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