Соответствие исключений Regex и grep - PullRequest
1 голос
/ 14 апреля 2011

Я проверил свое регулярное выражение на соответствие исключений в файле журнала:

http://gskinner.com/RegExr/

регулярное выражение:

.+Exception[^\n]+(\s+at.++)+

И это работает для пары случаев, которые я вставил сюда, но не когда я использую это с grep:

grep '.+Exception[^\n]+(\s+at.++)+' server.log

Нужны ли grep дополнительные флаги, чтобы он работал с регулярным выражением?

Обновление:

Это не обязательно регулярное выражение, я ищу что-нибудь, что напечатает исключения.

Ответы [ 3 ]

2 голосов
/ 14 апреля 2011

Не все версии 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

Это должно дать вам достаточно вариаций для игры.

Я не понимаю, почему люди используют веб-построители «регулярных выражений», когда они могут просто делать то же самое в командной строке с существующими инструментами, поскольку таким образом они могут быть абсолютно уверены, что разработанные ими шаблоны будут работать с этими инструментами. .

1 голос
/ 14 апреля 2011

Вам необходимо передать ему параметр -e <regex> и, если вы хотите использовать расширенное регулярное выражение -E -e <regex>.Взгляните на мужчину: man grep

0 голосов
/ 14 апреля 2011

Похоже, вы пытаетесь найти строки, которые выглядят примерно так:

... Exception foobar at line 7 ...

Итак, во-первых, чтобы использовать регулярные выражения, вы должны использовать -e с grep, или вы можете просто запустить egrep.

Далее вам не нужно указывать .+ в начале выражения. Обычно лучше минимизировать то, что вы ищете. Если необходимо, чтобы перед «Исключением» был хотя бы один символ, просто используйте ..

Кроме того, \s - это полный способ просить пробел. grep использует регулярное выражение POSIX, поэтому эквивалент [[:space:]].

Итак, я бы использовал:

 grep -e 'Exception.*[[:space:]]at'

Это получит то, что вы хотите, с наименьшим количеством шума и суеты.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...