Предлагаю запомнить, если ещё не запомнили, несколько простых вещей, которые требуются более-менее регулярно. По крайней мере я их помню. Покажу на примере парсинга вывода команды
history. Это подходящий вариант для демонстрации. 🟢 В регулярных выражениях используются так называемые якоря, или анкоры. Наиболее часто встречающиеся:
^ - начало строки, $ - конец. Сразу пример. Допустим, мы когда-то использовали certbot в консоли. Если сделать grep по этому имени, то вылезут строки, где мы его устанавливали или запускали службу с таким именем, где смотрели логи и т.д. А нам нужна команда, которая в консоли начиналась с certbot:# grep '^certbot' ~/.bash_historycertbot certonlyЕсли убрать
^, то будут выведены все строки, в которых где угодно встречалось слово certbot. То же самое, только с концом строки. Выведу команду, где в конце указан IP адрес:# grep '75.35.224.135$' ~/.bash_historyfail2ban-client set nginx-limit-conn unbanip 75.35.224.135Регулярно залетаю в бан на своём сайте, когда тестирую что-то. Команду на разбан всегда подсматриваю.
Оба анкора вместе
^$ означают пустую строку. Удобно использовать для чистки конфигов, логов от пустых строк.🟢 Далее стоит знать специальные символы
\n - новая строка, \t - табуляция. Это бывает нужно, когда стоит задача удалить эти табуляции, или наоборот добавить. Примерно так:# echo -e '\tThis is line with tab' >> file.txt# echo -e '\nThis is new line' >> file.txtМожно заменить переход на новую строку пробелом или удалить все табуляции:
# cat file.txt | tr '\n' ' ' или просто
# tr '\n' ' ' < file.txtУдаляем табы:
# tr -d '\t' < file.txt🟢 Часто приходится использовать оператор или в виде прямой черты
|. Это прям самое популярное из регулярок. Грепаем что-то с набором условий:# grep 'postfix\|dovecot' ~/.bash_historyВыведет все строки, где встречается либо postfix, либо dovecot. Здесь же я сразу упомянул ещё один специальный символ регулярных выражений, который занимается экранированием -
\. Если его не поставить, то grep будет искать буквально фразу postfix|dovecot и ничего не найдёт. Но при этом можно сделать вот так:# grep -E "postfix|dovecot" ~/.bash_historyИ поиск нормально сработает. Дело в том, что у регулярных выражений существуют разные диалекты. Ключ
-E включает реализацию Extended Regular Expression (ERE), где получается всё наоборот. Метасимвол или | экранировать не надо. А вот если мы хотим найти слово с этим символом, то нам его надо экранировать. По умолчанию grep использует диалект Basic Regular Expressions (BRE). Всё это зачастую добавляет путаницу и приходится постоянно пробовать, то так, то эдак экранировать, когда использует разные утилиты и перенаправления потоков.В общем-то, это всё, что лично я помню. Если нужно использовать шаблоны, диапазоны, условия, открываю шпаргалки. Сходу правильно написать регулярку у меня не получится.
📌 Полезные ссылки по теме:
▪️ regex101.com — проверка регулярных выражений
▪️ grex — автоматическое составление регулярок
▪️ regexper.com — схематическое изображение регулярок
▪️ ihateregex.io — готовые примеры регулярных выражений
▪️ autoregex.xyz — построение регулярок с помощью ИИ
▪️ stepik.org — бесплатный курс для изучения регулярок
▪️ regexlearn.com — обучение regex на русском языке
#regex