Как использовать регулярные выражения с Grep (Regex)

12 set 2022 5 min di lettura
Как использовать регулярные выражения с Grep (Regex)
Indice dei contenuti

Введение

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

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

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

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

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

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

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

Поиск буквальных символов (литеральные совпадения)

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

grep bash /etc/passwd

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

root:x:0:0:root:/root:/bin/bash
 noviello:x:1000:1000:noviello:/home/noviello:/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

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

Соответствие одному символу

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

grep 'nov..llo' file.txt

Скобочные выражения

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

grep 'acce[np]t' file.txt

Если первый символ внутри скобок является точкой вставки ^, grep найдет любой одиночный символ, не заключенный в скобки. Следующий шаблон будет соответствовать любой комбинации строк, начинающихся с «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 раз.

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

grep 's*right'

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

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

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

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

Чередование

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

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

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

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

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

Группировка

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

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

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

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

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

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

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

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

grep '\b[ao]bject\b' file.txt

Вывод

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

Buy me a coffeeBuy me a coffee

Supportaci se ti piacciono i nostri contenuti. Grazie.

Successivamente, completa il checkout per l'accesso completo a Noviello.it.
Bentornato! Accesso eseguito correttamente.
Ti sei abbonato con successo a Noviello.it.
Successo! Il tuo account è completamente attivato, ora hai accesso a tutti i contenuti.
Operazione riuscita. Le tue informazioni di fatturazione sono state aggiornate.
La tua fatturazione non è stata aggiornata.