
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 . Умение составлять регулярные выражения может быть очень полезно при поиске в текстовых файлах, написании скриптов или фильтрации вывода команд.
Если у вас есть вопросы или пожелания, не стесняйтесь оставлять комментарии.
Связанные руководства