正则表达式和grep异常匹配

时间:2011-04-14 10:45:16

标签: python regex linux perl grep

我测试了我的正则表达式,以便在日志文件中匹配异常:

http://gskinner.com/RegExr/

正则表达式是:

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

它适用于我粘贴在这里的几个案例,但不适用于我使用grep时:

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

grep是否需要一些额外的标志才能使它与regex一起工作?

更新:

它不一定是正则表达式,我正在寻找任何可以打印异常的东西。

3 个答案:

答案 0 :(得分:2)

并非grep的所有版本都理解相同的语法。

  • 您的模式包含一个或多个重复的+,这意味着它位于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 :(得分:1)

如果要使用扩展正则表达式-e <regex>,则需要将-E -e <regex>选项传递给它。看看那个男人:man grep

答案 2 :(得分:0)

看起来你正试图找到类似的行:

... Exception foobar at line 7 ...

首先,要使用正则表达式,您必须将-egrep一起使用,或者只需运行egrep

接下来,您不必在表达式的开头指定.+。通常最好尽量减少您要搜索的内容。如果必须在“例外”之前至少有一个字符,那么只需使用.

此外,\s是一种要求空间的perl-ish方式。 grep使用POSIX正则表达式,因此等效于[[:space:]]

所以,我会用:

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

这样可以用最少量的麻烦得到你想要的东西。

相关问题