Регулярные выражения в Linux: понятное руководство для начинающих

Быстрые ссылки
- Что такое регулярные выражения?
- От простого к сложному
- Номера строк и другие приёмы grep
- Оператор альтернативы
- Регистр символов
- Якоря
- Подстановки (wildcards)
- Классы символов
- Интервальные выражения
- Экранирование символов
- Якоря слов
- Дополнительные классы символов
- Ничто не непроницаемо
- Двигайтесь медленно
Что такое регулярные выражения?
Регулярные выражения (regex, «регулярки») — компактный способ описать шаблон символов для поиска в тексте. Проще: это «поисковый язык», который отвечает на вопрос “Какие строки подходят под этот шаблон?”. Однострочное определение: регулярное выражение — это строка, содержащая буквенно-символьные элементы и специальные метасимволы, которые описывают правила совпадения.
В экосистеме Linux есть несколько «вкусов» регулярных выражений (BRE, ERE, PCRE и т. п.). В этом руководстве мы ориентируемся на расширенные регулярные выражения (ERE), которые часто используют в утилитах вроде grep с опцией -E (grep -E) или в устаревшем, но распространённом egrep. Примеры также будут совместимы с практикой стандартных оболочек и текстовых утилит.
Важно: если вы используете регулярки в скриптах на Perl/Python/Ruby, там могут быть дополнительные конструкции (PCRE, lookaround и т. п.). Здесь — базовый, надёжный набор для командной строки.
Основные идеи перед началом
- Метасимволы дают правила сопоставления: . ^ $ * + ? {n,m} [] () | \ и т. д.
- В командах оболочки кавычки защитят регулярное выражение от подстановок оболочки. Обычно используйте одинарные кавычки: ‘pattern’.
- grep по умолчанию использует базовые регулярки; для расширенных удобнее grep -E или egrep.
- Читайте регулярку слева направо, разбивая на логические части.
Как использовать grep и egrep
- grep -E ‘pattern’ file — поиск с расширенными регулярными выражениями
- egrep ‘pattern’ file — синоним grep -E (во многих системах присутствует, официально устаревает)
- grep -F ‘text’ file — поиск «как есть» (фиксированные строки), без интерпретации метасимволов
Пример: чтобы найти букву o в файле geeks.txt:
grep -E 'o' geeks.txtЕсли вы предпочитаете сокращённый вызов, можно создать alias, например в ~/.bashrc:
alias ge='grep -E'От малого к большому — примерный рабочий файл
Для демонстрации будем использовать обычный текстовый файл со списком имён (geeks.txt). В практике вы будете применять те же приёмы к логам, CSV, JSONL и любому тексту.
Пример вывода (первый фрагмент файла) может выглядеть примерно так:
less geeks.txt(Картинки в исходной статье показывают вывод в терминале; здесь важнее понять структуру — каждая строка соответствует одной записи/имени.)
Простой поиск
Ищем букву o:
grep -E 'o' geeks.txtКаждая строка, где есть буква o, будет напечатана, а совпадение подсвечено (в поддерживающем терминале).
Ищем подряд “oo”:
grep -E 'oo' geeks.txtЭто точный буквальный поиск последовательности “oo”.
Номера строк и другие приёмы grep
Несколько полезных опций grep (которые не являются метасимволами регулярных выражений, но часто используются вместе с ними):
- -n — показать номер строки
- -o — показывать только совпадающую часть
- -c — подсчитать количество строк с совпадением
- -H — показывать имя файла (полезно при поиске в нескольких файлах)
- -r / -R — рекурсивный поиск по каталогу
- -i — игнорировать регистр
- -v — инвертировать совпадения (показать строки без шаблона)
Примеры комбинирования:
grep -E -n -o 'o' geeks.txtПокажет номер строки и саму букву o как отдельное совпадение.
grep -E -c 'o' geeks.txtВернёт число строк с буквой o.
Совет: при поиске по множеству файлов удобно добавить –line-number или -H, чтобы понимать, где найдено совпадение.
Оператор альтернативы | (pipe)
Оператор | означает «или»: сопоставляется либо левый, либо правый шаблон.
grep -E -n -o 'll|oo' geeks.txtВыведет все места с “ll” или “oo”. Альтернатива полезна для простых вариантов, но при сложных сочетаниях лучше группировать или использовать классы символов.
Регистр символов и опция -i
Чтобы сопоставить “am” и “Am” одновременно, есть два подхода:
- Явная альтернатива: am|Am — быстро становится громоздкой.
- Опция grep: -i — игнорировать регистр.
Пример:
grep -E -i 'am' geeks.txtЭто найдёт как “am”, так и “Am” и “AM” и т. д.
Якоря — начало и конец строки
Якоря ограничивают позицию совпадения внутри строки:
- ^ — начало строки
- $ — конец строки
Пример: найти строки, начинающиеся с “am” (без учёта регистра):
grep -E -i '^am' geeks.txtНайти строки, где двойная n в конце строки:
grep -E -i 'nn$' geeks.txtВажно: ^ и $ относятся к строке, а не к слову — в многострочных файлах это именно начало/конец каждой строки.
Подстановки (wildcards)
- . (точка) соответствует ровно одному любому символу (кроме перевода строки).
- означает «ноль или более совпадений предыдущего элемента».
Пример: шаблон T.m соответствует “Tim” и “Tom”:
grep -E 'T.m' geeks.txtЕсли нужно «любой символ, затем много любых символов», используйте комбинацию . и : J.n — J, затем любая последовательность символов, затем n.
grep -E 'J.*n ' geeks.txtОбратите внимание: относится к предыдущему символу или группе. Выражение ct означает “ноль или более букв c, затем t” — т.е. t, ct, cct и т. п. Это частая ловушка.
Классы символов []
Квадратные скобки определяют набор допустимых символов на одной позиции:
- [abc] — соответствует a, b или c
- [a-z] — диапазон символов
- [^a] — любой символ, кроме a (если ^ стоит первым внутри скобок)
Примеры:
grep -E '^[NW]' geeks.txtНайдёт строки, начинающиеся с N или W.
grep -E 'T[oi]m' geeks.txtНайдёт Tom или Tim.
grep -E 'T[^o]m' geeks.txtНайдёт Tm, Tbm, Tcm и т. д., но не Tom.
grep -E 'T[aeiou]m' geeks.txtНайдёт имена вроде Tim, Tom, Team (если структура файла позволяет).
Сочетания классов
Вы можете вкладывать классы и сочетать диапазоны: [A-Za-z0-9_] — почти стандартный набор для идентификаторов.
Интервальные выражения {n,m}
Фигурные скобки позволяют задать количество повторов предыдущего символа или группы:
- {n} — ровно n
- {n,} — n или более
- {n,m} — от n до m включительно
Пример: найти T с 1–2 гласными между T и m:
grep -E 'T[aeiou]{1,2}m' geeks.txtЭто сопоставит Tim, Tom и Team.
Другой пример: el{2} — соответствует ell. А el{1,2} — соответствует el или ell.
grep -E 'el{1,2}' geeks.txtИли класс для двух или более гласных подряд:
grep -E '[aeiou]{2,}' geeks.txtЭкранирование символов
Когда метасимвол используется как обычный символ, его нужно экранировать обратным слэшем .
Пример: точка . означает «любой символ», а мы хотим найти настоящую точку в конце строки:
grep -e '\.$' geeks.txt(В оболочке и в коде обратный слэш обычно нужно экранировать ещё раз, поэтому в некоторых языках вы увидите “\.”.)
Важно: в grep есть опции и синтаксисы (-E vs -G и т. д.), которые меняют требования к экранированию. Обычно с grep -E экранировать нужно меньше, чем с базовыми регулярками.
Якоря слов — границы слова
Якоря начала/конца слова позволяют работать с целыми словами, а не только с позициями строки:
- \< и > — начало и конец слова (в некоторых реализациях grep; экранирование важно)
- \b — граница слова (Word boundary) — чаще встречается в PCRE
- \B — «не граница слова” — внутри слова
Пример: найти слово Glenn целиком:
grep -E '\bGlenn\b' geeks.txtНайти последовательность way внутри слова (не на границе):
grep -E '\Bway\B' geeks.txtЗамечание: поддержка \b/\B зависит от версии grep. Если не работает, используйте альтернативы с классами символов.
Дополнительные классы символов и сокращения
Вместо ручного перечисления можно использовать диапазоны и часто используемые наборы:
- [A-Z], [a-z], [0-9]
- [d-p] — произвольный диапазон символов
- Можно комбинировать классы: [A-Za-z0-9]
Пример сложной компактной конструкции:
grep -E 'J[os][ehls]' geeks.txtЭто сопоставляет любые строки, где после J идёт o или s, а затем одна из букв e, h, l или s.
Пример с произвольным числом строчных букв: H[a-z]*man найдёт “Herman”, “Huffman” (в зависимости от файла):
grep -E 'H[a-z]*man' geeks.txtНичто не непроницаемо — разбор сложной регулярки
Иногда регулярки выглядят так:
grep -E '^([0-9]{4}[- ]){3}[0-9]{4}|[0-9]{16}' geeks.txtРазберём по частям:
- ^ — начало строки
- ([0-9]{4}[- ]) — группа: четыре цифры, затем либо дефис, либо пробел
- {3} — эта группа повторяется три раза (итого три группы по четыре цифры + разделитель)
- [0-9]{4} — затем ещё четыре цифры
- | — или
- [0-9]{16} — 16 подряд идущих цифр
Итого: шаблон нацелен на форматы номеров карт: либо 4-4-4-4 с пробелом или дефисом, либо 16 цифр подряд.
Такой разбор полезен: если вы видите длинную строку регулярки, разбивайте её на логические блоки и проверяйте каждый по отдельности.
Когда регулярные выражения не подходят
Регулярки хороши для паттернов и однотипных текстов. Но они не всегда лучший инструмент:
- Когда у вас вложенная или рекурсивная структура (например, правильно парсить HTML/XML с произвольной вложенностью). Для этого лучше использовать парсер (XML/HTML parser).
- Когда требуется контекст из нескольких файлов и сложная логика — лучше писать скрипт на Python/Perl.
- Когда нужно гарантировать корректность по сложной грамматике — используйте парсеры, генераторы (ANTLR и т. п.).
Альтернативные инструменты и подходы
- sed — стримовый редактор, полезен для простых замен: sed -E ‘s/pattern/repl/g’
- awk — мощнее для разбора по полям и подсчётов: awk ‘/pattern/ {print $0}’
- Perl — обладает мощными PCRE-виражами и удобен для сложных текстовых преобразований: perl -ne ‘print if /pattern/‘
- Python — для сложной логики и структурированных данных: re, regex, pandas
- ripgrep (rg) — быстрее grep для больших дерев и современных систем, поддерживает PCRE при помощи флага -P
Пример: найти и заменить с помощью sed:
sed -E 's/([0-9]{4})-([0-9]{4})/\1 \2/g' file.txtПрактические советы по отладке регулярок
- Начните с малого: сначала проверьте простые части шаблона.
- Используйте опцию -o, чтобы видеть только совпавшие фрагменты.
- Добавляйте -n, чтобы видеть номера строк.
- Тестируйте в REPL: echo “строка” | grep -E ‘pattern’
- Если регулярка не даёт ожидаемых результатов, попробуйте заменить метасимволы на буквальное совпадение (экранируя их) и затем добавляйте по одному метасимволу.
- Используйте визуальные онлайн-отладчики (regex101, regexr) для PCRE, но помните про различия между PCRE и ERE.
Безопасность и приватность при работе с текстом
- Никогда не запускайте регулярки для изменения данных в производственных логах без бэкапа.
- При поиске личных данных (контакты, номера карт) соблюдайте корпоративные правила по защите данных и GDPR: лучше работать на копиях или обезличенных данных.
- Регулярки, которые захватывают большие участки текста (гребущие квантификаторы .*) могут вызвать высокую нагрузку и даже ReDoS (Regular Expression Denial of Service) при внешнем взаимодействии — избегайте чрезмерно общего шаблона для пользовательского ввода.
Чек-листы по ролям
Разные роли используют регулярки по-разному. Короткие контрольные списки:
Системный администратор:
- Добавить -n и -H при поиске в нескольких файлах.
- Использовать -r для рекурсивного поиска.
- Всегда тестировать шаблоны на копии логов.
Разработчик:
- При сложных трансформациях использовать Perl/Python.
- Писать модульные тесты для критичных регулярок.
- Рассмотреть использование именованных групп и комментариев (в PCRE / verbose mode) для читаемости.
Аналитик данных:
- Проверять, не разрезает ли регулярка значения на границах полей.
- Использовать awk/pandas для проверок и агрегирования после фильтра.
Шпаргалка (cheat sheet) — часто используемые шаблоны
- Любая цифра: [0-9]
- Любая буква: [A-Za-z]
- Пробел или таб: [ \t]
- Любое слово: \w (PCRE) или [A-Za-z0-9_]
- Начало строки: ^
- Конец строки: $
- Любой символ: .
- Ноль или более: *
- Одна или более: +
- Опционально: ?
- Точное число: {n}
- Диапазон: {n,m}
- Альтернатива: |
- Границы слова: \b (PCRE)
Примеры реальных команд:
- Подсчитать количество уникальных email (упрощённый):
grep -E -o '[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}' file.txt | sort | uniq -c | sort -nr- Найти строки с IP-адресом (пример):
grep -E -o '([0-9]{1,3}\.){3}[0-9]{1,3}' access.log(Примечание: корректная валидация IP требует дополнительной логики, этот шаблон прост и быстрый.)
Критерии приёмки для регулярных выражений
Перед тем как включать регулярное выражение в рабочий процесс, проверьте:
- Набор тестов: положительные и отрицательные примеры (не менее 5–10 случаев).
- Производительность: на максимальном объёме данных.
- Понятность: комментарии или документированная цель регулярки.
- Безопасность: защита от ReDoS при приёме пользовательских паттернов.
Пример набора тестов для шаблона кредитной карты:
- 4111 1111 1111 1111 → матч
- 4111-1111-1111-1111 → матч
- 4111111111111111 → матч
- 4111 111 → не матч
- abcdefghijklmnop → не матч
Тест-кейсы и примеры приёмки
- Поиск всех имён, начинающихся на J и заканчивающихся на n (имя + пробел после):
# Ожидаемые совпадения: Jason, John
grep -E 'J.*n ' geeks.txt- Поиск первых имён, начинающихся с N или W:
# Используем якорь начала строки и класс
grep -E '^[NW]' geeks.txt- Найти строки, содержащие два и более гласных подряд:
grep -E '[aeiou]{2,}' geeks.txtМентальные модели и эвристики при составлении регулярок
- Разделяй и властвуй: разбивайте большие регулярки на подвыражения и тестируйте по частям.
- От частного к общему: сначала найдите самые строгие признаки, затем расширяйте шаблон, чтобы покрыть вариации.
- Минимализм: чем короче и специфичнее шаблон, тем меньше ложных срабатываний и выше производительность.
- Безопасность: избегайте “жадных” .*, если можно сузить класс символов.
Примеры альтернативных подходов (когда regexp уступает)
- При структурированном формате (CSV/JSON) удобнее использовать парсер, который разбирает поля по правилам формата.
- Для сложных подтверждений (например, контрольные суммы карт) используйте специализированные библиотеки.
- Для потоковой обработки больших объёмов данных эффективнее ripgrep (rg) или бинарные парсеры.
1-строчная глоссарий
- Regex: регулярное выражение — шаблон для сопоставления текста.
- Метасимвол: символ с особым значением в regex (., *, +, ?, ^, $, [], {}, |, ).
- Якорь: позиция в строке (начало ^, конец $).
- Класс символов: набор символов в квадратных скобках [] для одной позиции.
- Квантификатор: обозначает число повторов ({n,m}, *, +, ?).
Полезные примеры и сниппеты
- Поиск строк, где слово “error” встречается как отдельное слово (без учёта регистра):
grep -i -E '\berror\b' /var/log/syslog- Удалить все строки, содержащие только пробелы и табы, и сохранить результат:
grep -v -E '^[[:space:]]*$' input.txt > cleaned.txt- Найти последовательности цифр длиной 4–6 и вывести уникальные:
grep -E -o '[0-9]{4,6}' file.txt | sort | uniqСоветы по читаемости и сопровождению
- Документируйте цели каждого сложного шаблона рядом с ним (комментарий в скрипте).
- Если шаблон критичен, добавьте unit-тесты для него.
- Рассмотрите использование verbose-режима в расширенных движках (PCRE) для многострочных регулярок с комментариями.
Заключение
Регулярные выражения — мощный инструмент для поиска и трансформации текста в Linux. Они дают гибкость и скорость, но требуют аккуратности: чётко формулируйте задачу, начинайте с простых шаблонов, тестируйте на выборке и документируйте свои решения. Для сложных или рекурсивных задач выбирайте парсеры и скриптовые языки.
Важно: регулярки — не панацея, но при грамотном использовании они экономят много времени.
Краткое резюме и рекомендации:
- Используйте grep -E (или egrep) для удобства и читаемости.
- Тестируйте регулярки пошагово и применяйте опции -n, -o, -c для отладки.
- Экранируйте метасимволы, когда хотите искать буквально.
- Если шаблон слишком сложный или медленный, рассмотрите альтернативы (awk, sed, Perl, Python, rg).
Список литературы и дальнейшее чтение
- man grep — всегда полезно заглянуть в локальную справку.
- Документация по PCRE (если планируете использовать более мощные конструкции).
- Руководства по sed, awk и ripgrep для задач больших объёмов данных.
Важно: всегда работайте с резервной копией при массовых заменах и соблюдайте правила безопасности при обработке персональных данных.
Похожие материалы
Отправить Live Photo в Twitter как GIF
Фото как циферблат Apple Watch — инструкция
Хроматическая аберрация: причины и способы устранения
Как ограничить комментарии в Instagram