Регулярные выражения — шаблоны для grep, sed и awk
Регулярное выражение — шаблон, под который подходит множество строк; по нему ищут 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. Граница
слова — место между буквой, цифрой или _ и любым другим знаком:
terror не подошёл — перед err стоит буква. ERROR не подошёл по регистру:
его ловит -i.
Жадность
* и + забирают как можно больше символов:
[^>]* — «любые символы, кроме >»: совпадение кончается на первой >.
Ленивый .*? есть только в grep -P.
Рецепты
4Адрес IP
Конфиг без комментариев и пустых строк
Переставить части строки
Группы ( ) запоминают части совпадения, \1 и \2 вставляют их в замену.
Неполадки
5grep 'a|b' ничего не находит
Без -E знак | — обычный символ, и grep ищет строку a|b буквально. Код
1, вывода нет. Пиши grep -E 'a|b' или grep 'a\|b'.
\d находит букву d
\d есть только в PCRE. В grep -E это просто буква d:
Совпали 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.
Есть неточность? Сообщить об ошибке в статье