我测试了我的正则表达式,以便在日志文件中匹配异常:
正则表达式是:
.+Exception[^\n]+(\s+at.++)+
它适用于我粘贴在这里的几个案例,但不适用于我使用grep时:
grep '.+Exception[^\n]+(\s+at.++)+' server.log
grep是否需要一些额外的标志才能使它与regex一起工作?
更新:
它不一定是正则表达式,我正在寻找任何可以打印异常的东西。
答案 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 ...
首先,要使用正则表达式,您必须将-e
与grep
一起使用,或者只需运行egrep
。
接下来,您不必在表达式的开头指定.+
。通常最好尽量减少您要搜索的内容。如果必须在“例外”之前至少有一个字符,那么只需使用.
。
此外,\s
是一种要求空间的perl-ish方式。 grep使用POSIX正则表达式,因此等效于[[:space:]]
。
所以,我会用:
grep -e 'Exception.*[[:space:]]at'
这样可以用最少量的麻烦得到你想要的东西。