Ошибки в журнале записаны тремя способами, и одно слово их не описывает. Шаблон может перечислить варианты.
Квадратные скобки — набор: они совпадают с одним любым знаком из перечисленных. [Ee] — E или e, [0-9] — любая цифра, [1-9] — цифра от 1 до 9. Шаблон err=[1-9] совпадёт с err=5 и err=12, а err=0 пропустит.
Ключ -E включает расширенный синтаксис. В нём | разделяет варианты: строка подходит, если в ней совпал хотя бы один. Шаблон берут в одинарные кавычки, чтобы оболочка передала | и скобки grep как есть, а не строила из | конвейер.
Команда печатает восемь строк — все ошибки журнала и ничего лишнего.
Коллега набрал поиск без ключа -E: grep 'ERROR|Error:' app.log. Что напечатает grep?
-
Без -E grep не делит шаблон на варианты:
ERROR|Error:для него — одна строка из двенадцати знаков, и её нет нигде. -
Шаблон без -E допустим: grep принял его и не нашёл строк. Сообщения нет, а
echo $?после поиска печатает 1. -
Без -E знак
|для grep обычный: он ищет текстERROR|Error:целиком, а такого в журнале нет.
Без -E знак | для grep обычный, и он ищет текст ERROR|Error: целиком. Такого текста в журнале нет, поэтому вывод пустой. В базовом синтаксисе GNU grep варианты разделяет \|, но с -E шаблон читается проще.
Главное в шаге
-
Квадратные скобки совпадают с одним знаком из набора:
[1-9]— цифра от 1 до 9. -
grep -Eделит шаблон знаком|на варианты, и строка подходит по любому из них. -
Шаблон пишут в одинарных кавычках, иначе
|и скобки разберёт оболочка.