С чего начать Первые шаги трек · 15 ступеней
Linux Labs

Регулярные выражения — шаблоны для grep, sed и awk

5 мин Ubuntu 24.04 · GNU grep 3.11 · GNU sed 4.9

Регулярное выражение — шаблон, под который подходит множество строк; по нему ищут grep, sed и awk.

Шпаргалка

8 команд Версия для печати
  • grep -i 'error' app.log без учёта регистра
  • grep -E 'error|fail' app.log одно из слов
  • grep 'error\|fail' app.log то же в базовом синтаксисе GNU
  • grep -w 'err' app.log целое слово: не terror
  • grep -oE '\berr\b' app.log то же через границы слова
  • grep -E '^[0-9]+$' file строка только из цифр
  • grep -F '10.20.0.15' file буквально, без спецсимволов
  • sed -E 's/^(\w+) *= */\1=/' app.ini группа \1 в замене

Обзор

Регулярное выражение — шаблон, под который подходит множество строк: err(or)? подходит и к err, и к error. По шаблону grep ищет строки, sed заменяет текст, awk выбирает строки для действия. Шаблон бери в одинарные кавычки, чтобы оболочка не тронула *, $ и \.

В GNU grep и sed два синтаксиса. Они понимают одно и то же, разница в обратной косой черте:

базовый (BRE) расширенный (ERE)
где grep, sed по умолчанию grep -E, sed -E, awk
+ ? { } | ( ) со \: \+, \|, \(…\) без \

Третий диалект — PCRE в grep -P: в нём есть \d, ленивые повторы *? и (?:…).

Элементы шаблона

Шаблон Что значит
. любой один символ
[abc], [^abc] один из перечисленных, любой кроме них
[0-9], [[:digit:]] цифра
*, +, ? 0 и больше, 1 и больше, 0 или 1 раз
{2,5} от 2 до 5 раз
^, $ начало и конец строки
\b, \<, \> граница слова
\w, \s буква, цифра или _; пробельный символ
a|b a или b
(…) группа: повтор целиком или \1 в замене
\., \* сама точка, сама звёздочка

\b, \<, \>, \w и \s GNU grep и sed понимают и без -P. Граница слова — место между буквой, цифрой или _ и любым другим знаком:

text
student@ubuntu:~$ grep -oE '\berr\b' app.log
err
student@ubuntu:~$ grep -w err app.log
err=5 retry

terror не подошёл — перед err стоит буква. ERROR не подошёл по регистру: его ловит -i.

Жадность

* и + забирают как можно больше символов:

text
student@ubuntu:~$ echo '<a><b>' | grep -Eo '<.*>'
<a><b>
student@ubuntu:~$ echo '<a><b>' | grep -Eo '<[^>]*>'
<a>
<b>

[^>]* — «любые символы, кроме >»: совпадение кончается на первой >. Ленивый .*? есть только в grep -P.

Рецепты

4

Слово в любом регистре и написании

text
student@ubuntu:~$ grep -iE '^(error|err)\b' app.log
ERROR disk full
Error: timeout
err=5 retry

Адрес IP

bash
grep -oE '[0-9]{1,3}(\.[0-9]{1,3}){3}' app.log   # любой адрес
grep -oE '10\.20\.0\.15\b' app.log               # этот, без 10.20.0.150

Конфиг без комментариев и пустых строк

bash
grep -vE '^\s*(#|$)' /etc/ssh/sshd_config

Переставить части строки

bash
echo 'key = "va lue"' | sed -E 's/^(\w+) *= *"(.*)"$/\1=\2/'
text
key=va lue

Группы ( ) запоминают части совпадения, \1 и \2 вставляют их в замену.

Неполадки

5

grep 'a|b' ничего не находит

Без -E знак | — обычный символ, и grep ищет строку a|b буквально. Код 1, вывода нет. Пиши grep -E 'a|b' или grep 'a\|b'.

\d находит букву d

\d есть только в PCRE. В grep -E это просто буква d:

text
student@ubuntu:~$ grep -E '\d+' app.log
ERROR disk full
ip 10.20.0.15 and 10.20.0.150

Совпали disk и and. Для цифр пиши [0-9] или [[:digit:]], либо grep -P '\d+'.

Unmatched ( or (

Скобка в шаблоне не закрыта: grep -E '(err' выходит с кодом 2. Для [ сообщение Unmatched [, [^, [:, [., or [=. Нужна сама скобка — экранируй её: \(.

Точка находит лишнее

grep -o '10.20.0.15' находит и начало 10.20.0.150: точка — любой символ, а конец адреса не ограничен. Экранируй точки и закрой шаблон границей: '10\.20\.0\.15\b'.

Звёздочку раскрыла оболочка

Без кавычек grep error.* app.log оболочка может заменить error.* на имена подходящих файлов. Шаблон всегда бери в одинарные кавычки.

См. также

  • grep — поиск строк по шаблону.
  • sed-awk — замена по шаблону и обработка полей.
  • globbing — шаблоны имён файлов: похожи, но значат другое.
  • test-conditions — [[ $x =~ … ]] в bash.
  • text-tools — sort, uniq, cut для разбора найденного.
  • find — поиск файлов по имени и -regex.
Загрузка…