Регулярные выражения (grep -E, sed)
Базовый синтаксис регулярок: якоря, классы, кванторы, группы. Поиск через grep -E и замена через sed.
Зачем регулярки
В уроке про pipes мы фильтровали логи через grep по простой строке. Но
часто нужно найти не точное слово, а шаблон: все IP-адреса, все строки с
кодом ошибки 5xx, все email. Для этого есть регулярные выражения
(regex). Это язык описания шаблонов текста, и он одинаков (с мелкими
отличиями) в grep, sed, awk и большинстве языков программирования.
Якоря и классы символов
Базовые кирпичи:
^начало строки,$конец строки..любой один символ.[abc]один из символов в скобках,[a-z]диапазон,[^abc]любой кроме перечисленных.[0-9]цифра,\wбуква/цифра/подчёркивание,\sпробельный символ (последние два — GNU-расширения). Короткой записи\dдля цифры вgrep -Eнет: это синтаксис PCRE, доступный только черезgrep -P.
$ grep -E "^ERROR" app.log # строки, начинающиеся с ERROR
$ grep -E "[0-9]{3}$" app.log # строки, кончающиеся тремя цифрами
Флаг -E включает расширенный синтаксис (ERE), где +, ?, |, ()
работают без экранирования. Без -E их пришлось бы писать как \+, \?.
Поэтому grep -E берут по умолчанию.
Кванторы
Кванторы говорят, сколько раз повторяется предыдущий элемент:
*ноль или больше,+один или больше,?ноль или один.{n}ровно n раз,{n,m}от n до m.
$ grep -E "[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}" access.log
Это грубый шаблон IP-адреса: четыре группы из 1–3 цифр, разделённые точками.
Точку экранируют как \., потому что без экранирования . это «любой
символ».
Группы и альтернатива
() группируют, | это «или»:
$ grep -E "(GET|POST) /api" access.log # строки с GET или POST к /api
Группа (GET|POST) находит любой из вариантов. Группы ещё используются в
замене, чтобы ссылаться на найденное.
Замена через sed
grep находит, sed заменяет по шаблону. Синтаксис s/шаблон/замена/:
$ echo "user=alice" | sed -E 's/user=(.+)/login: \1/'
login: alice
Группа (.+) запоминает найденное, а \1 подставляет его в замену. Так
переформатируют строки по шаблону. Флаг g в конце (s/.../.../g) заменяет
все вхождения в строке, а не только первое. Из урока про sed: sed -i
правит файл на месте.
Что важно запомнить
Регулярка — шаблон текста: якоря (^/$), классы ([a-z]), любой символ
(.), кванторы (*/+/?/{n,m}), группы и альтернатива ((a|b)). Точку
как символ экранируют (\.).
grep -E "шаблон" ищет по шаблону, sed -E 's/что/на_что/g' заменяет, а
группы (...) запоминают найденное и подставляются через \1. Флаг -E
включает удобный расширенный синтаксис.
В следующем уроке разберём архивы: tar, сжатие и распаковку.
Прошли материал до конца? Отметьте урок пройденным.
Прогресс сохранён в этом браузере
Почистишь историю или откроешь с телефона, и отметки пропадут. Оставь почту, они переедут в аккаунт. Пароль придумывать не нужно.
Готово. теперь в аккаунте: прогресс виден с любого устройства. Мой прогресс