Гид по технологиям

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

12 min read Командная строка Обновлено 24 Dec 2025
Регулярные выражения в Linux — понятное руководство
Регулярные выражения в 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 → не матч

Тест-кейсы и примеры приёмки

  1. Поиск всех имён, начинающихся на J и заканчивающихся на n (имя + пробел после):
# Ожидаемые совпадения: Jason, John
grep -E 'J.*n ' geeks.txt
  1. Поиск первых имён, начинающихся с N или W:
# Используем якорь начала строки и класс
grep -E '^[NW]' geeks.txt
  1. Найти строки, содержащие два и более гласных подряд:
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 для задач больших объёмов данных.

Важно: всегда работайте с резервной копией при массовых заменах и соблюдайте правила безопасности при обработке персональных данных.

Поделиться: X/Twitter Facebook LinkedIn Telegram
Автор
Редакция

Похожие материалы

Отправить Live Photo в Twitter как GIF
Социальные сети

Отправить Live Photo в Twitter как GIF

Фото как циферблат Apple Watch — инструкция
How-to

Фото как циферблат Apple Watch — инструкция

Хроматическая аберрация: причины и способы устранения
Фотография

Хроматическая аберрация: причины и способы устранения

Как ограничить комментарии в Instagram
Социальные сети

Как ограничить комментарии в Instagram

Отправлять RSS на почту через IFTTT
Автоматизация

Отправлять RSS на почту через IFTTT

Подключение контроллера PS4/PS5 к Nintendo Switch
Гайды

Подключение контроллера PS4/PS5 к Nintendo Switch