Не все версии grep
понимают один и тот же синтаксис.
- Ваш паттерн содержит
+
для 1 или более повторов, что означает, что он находится на egrep
территории.
- Но он также имеет
\s
для пробелов, о которых большинство версий grep
не знают.
- Наконец, у вас есть
++
, означающее притяжательное совпадение предыдущего атома, которое понимают только довольно сложные механизмы регулярных выражений. Вы можете попробовать не притяжательный матч.
Однако вам не нужен ведущий .+
, поэтому вы можете перейти прямо к нужной вам строке. Кроме того, я не понимаю, почему вы бы использовали [^\n]
, поскольку именно это обычно означает .
, и поскольку вы все равно уже работаете в линейном режиме.
Если у вас есть grep -P
, вы можете попробовать это. Я использую более простую, но эквивалентную версию вашего паттерна; вы не используете опцию grep
, которая дает только точное совпадение, поэтому я предполагаю, что вам нужна вся запись:
$ grep -P 'Exception.+\sat' server.log
Но если это не сработает, вы всегда можете достать большие пушки:
$ perl -ne 'print if /Exception.+\sat/' server.log
А если вам нужно точное совпадение, вы можете использовать
$ perl -nle 'print $& if /Exception.*\bat\b.*/' server.log
Это должно дать вам достаточно вариаций для игры.
Я не понимаю, почему люди используют веб-построители «регулярных выражений», когда они могут просто делать то же самое в командной строке с существующими инструментами, поскольку таким образом они могут быть абсолютно уверены, что разработанные ими шаблоны будут работать с этими инструментами. .