Соответствие регулярных выражений и исключений grep

1

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

http://gskinner.com/RegExr/

Regex:

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

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

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

Требуется ли grep дополнительные флаги, чтобы заставить его работать с regex?

Обновление:

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

  • 0
    Вы указали, что несколько ответов не работают. Можете ли вы привести примеры того, как они не работают? В идеале, линии, которые вы ожидаете, будут совпадать, которые не совпадают, или линии, которые вы ожидаете, чтобы не совпадать, которые соответствуют
Теги:
grep

3 ответа

2

Не все версии 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, когда они могут просто сделать то же самое в командной строке с существующими инструментами, так как они могут быть абсолютно уверены, что шаблоны, которые они разрабатывают, будут работать с этими инструментами.

1

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

  • 0
    спасибо за ответ, я сделал, но это все еще не работает
  • 0
    @ Лондон Я отредактировал ответ, теперь должен работать (я так думаю)
Показать ещё 1 комментарий
0

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

... Exception foobar at line 7 ...

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

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

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

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

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

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

  • 0
    спасибо за ответ, это не сработает

Ещё вопросы

Сообщество Overcoder
Наверх
Меню