Я проверил свое регулярное выражение для соответствия исключениям в файле журнала:
Regex:
.+Exception[^\n]+(\s+at.++)+
И он работает для нескольких случаев, которые я вставил здесь, но не тогда, когда я использую его с grep:
grep '.+Exception[^\n]+(\s+at.++)+' server.log
Требуется ли grep дополнительные флаги, чтобы заставить его работать с regex?
Обновление:
Это не должно быть регулярное выражение, я ищу все, что будет печатать исключения.
Не все версии grep
понимают один и тот же синтаксис.
+
для 1 или более повторений, что означает, что он находится на территории egrep
.\s
для пробела, о котором большинство версий grep
не знают.++
для обозначения притяжательного совпадения предыдущего атома, который понимают только довольно сложные механизмы регулярных выражений. Вы можете попробовать непривлекательное совпадение.Однако вам не нужен ведущий .+
, поэтому вы можете перейти прямо к нужной строке. Кроме того, я не понимаю, почему вы использовали бы [^\n]
, так как это означает, что .
обычно означает, и потому, что вы все равно работаете в линейном режиме.
Если у вас grep -P
, вы можете попробовать это. Я использую более простую, но эквивалентную версию вашего шаблона; вы arent, используя опцию grep
, которая дает только точное совпадение, поэтому я предполагаю, что вы хотите всю запись:
$ grep -P 'Exception.+\sat' server.log
Но если это не работает, вы всегда можете выявить большие пушки:
$ perl -ne 'print if /Exception.+\sat/' server.log
И если вы хотите только точное совпадение, вы можете использовать
$ perl -nle 'print $& if /Exception.*\bat\b.*/' server.log
Это должно дать вам достаточно вариантов для игры.
Я не понимаю, почему люди используют веб-конструкторы regex, когда они могут просто сделать то же самое в командной строке с существующими инструментами, так как они могут быть абсолютно уверены, что шаблоны, которые они разрабатывают, будут работать с этими инструментами.
Вам нужно передать ему опцию -e <regex>
, и если вы хотите использовать расширенное регулярное выражение -E -e <regex>
. Взгляните на мужчину: man grep
Похоже, вы пытаетесь найти строки, которые выглядят примерно так:
... Exception foobar at line 7 ...
Итак, чтобы использовать регулярные выражения, вы должны использовать -e
с grep
, или вы можете просто запустить egrep
.
Далее вам не нужно указывать .+
в начале выражения. Обычно лучше всего свести к минимуму то, что вы ищете. Если необходимо, чтобы перед "Исключением" был хотя бы один символ, просто используйте .
.
Кроме того, \s
является perl-ish способом просить пробел. grep использует POSIX regex, поэтому эквивалент [[:space:]]
.
Итак, я бы использовал:
grep -e 'Exception.*[[:space:]]at'
Это позволит получить то, что вы хотите, с наименьшим количеством мусора и суеты.