grep
— одна из самых полезных и мощных команд Linux для обработки текста. grep
ищет в одном или нескольких входных файлах строки, соответствующие регулярному выражению, и записывает каждую совпадающую строку в стандартный вывод.
В этой статье мы собираемся изучить основы использования регулярных выражений в GNU-версии grep
, которая по умолчанию доступна в большинстве операционных систем Linux.
Содержание
Регулярное выражение Grep
Регулярное выражение или регулярное выражение — это шаблон, который соответствует набору строк. Шаблон состоит из операторов, конструирует буквальные символы и метасимволы, которые имеют особое значение. 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
искать строку, в которой сразу после 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
Еще один полезный пример — шаблон ^$
, который соответствует всем пустым строкам.
Соответствующий одиночный символ
Файл .
(точка) символ — это метасимвол, который соответствует любому одиночному символу. Например, чтобы сопоставить все, что начинается с «кан», затем имеет два символа и заканчивается строкой «ру», вы должны использовать следующий шаблон:
grep 'kan..roo' file.txt
Выражения в скобках
Выражения в квадратных скобках позволяют сопоставить группу символов, заключив их в квадратные скобки []
. Например, найдите строки, содержащие «принять» или «акцент», вы можете использовать следующее выражение:
grep 'acce[np]t' file.txt
Если первый символ внутри скобок — это курсор ^
, то он соответствует любому одиночному символу, не заключенному в скобки. Следующий шаблон будет соответствовать любой комбинации строк, начинающихся с «co», за которыми следует любая буква, кроме «l», за которой следует «la», например «coca», «cobalt» и т. Д., Но не будет соответствовать строкам, содержащим «cola». ”:
grep 'co[^l]a' file.txt
Вместо того, чтобы помещать символы по одному, вы можете указать диапазон символов внутри скобок. Выражение диапазона создается путем указания первого и последнего символов диапазона, разделенных дефисом. Например, [aa]
эквивалентно [abcde]
а [1-3]
эквивалентно [123]
.
Следующее выражение соответствует каждой строке, начинающейся с заглавной буквы:
grep '^[A-Z]' file.txt
grep
также поддерживает предопределенные классы символов, заключенные в скобки. В следующей таблице показаны некоторые из наиболее распространенных классов символов:
Квантификатор | Классы персонажей |
---|---|
[:alnum:] |
Буквенно-цифровые символы. |
[:alpha:] |
Буквенные символы. |
[:blank:] |
Пробел и табуляция. |
[:digit:] |
Цифры. |
[:lower:] |
Строчные буквы. |
[:upper:] |
Заглавные буквы. |
Полный список всех классов персонажей можно найти в руководстве по Grep .
Квантификаторы
Квантификаторы позволяют указать количество вхождений элементов, которые должны присутствовать, чтобы совпадение произошло. В следующей таблице показаны квантификаторы, поддерживаемые GNU grep
:
Символ *
(звездочка) соответствует предыдущему элементу ноль или более раз. Следующее будет соответствовать «right», «sright», «ssright» и так далее:
grep 's*right'
Ниже представлен более сложный шаблон, который соответствует всем строкам, которые начинаются с заглавной буквы и заканчиваются точкой или запятой. Регулярное выражение .*
Соответствует любому количеству любых символов:
grep -E '^[A-Z].*[.,]$' 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
включает несколько метасимволов, которые состоят из обратной косой черты, за которой следует обычный символ. В следующей таблице показаны некоторые из наиболее распространенных специальных выражений обратной косой черты:
Следующий шаблон будет соответствовать отдельным словам «abject» и «object». Он не будет соответствовать словам, если вложен в слова большего размера:
grep 'b[ao]bjectb' file.txt
Выводы
Регулярные выражения используются в текстовых редакторах, языках программирования и инструментах командной строки, таких как grep
, sed
и awk
. Знание того, как создавать регулярные выражения, может быть очень полезным при поиске текстовых файлов, написании сценариев или фильтрации вывода команд.
Если у вас есть какие-либо вопросы или отзывы, не стесняйтесь оставлять комментарии.
Очень доскональное описание, как раз нашел вещи которые не встретил в других статьях,
Я абобус
А я автобус
ок
А я кто?
Пидар
А я кто?
Я ломал стекло
hoer
<you>