好的,正则表达式巫师.我希望能够搜索我的日志文件并找到其中包含"错误"一词的任何会话,然后返回整个会话日志条目.
我知道我可以使用字符串/数组来完成此操作,但我想学习如何使用Regex,但这是问题所在.如果我决定用Regex做这个,我有一两个问题吗?; O)
这是日志:
PS:我正在使用perl Regex引擎.
注意:我认为我不能在Regex中完成这项工作.换句话说,我现在有两个问题.; o)我已经尝试了下面的解决方案但是,因为我通过声明我使用的是Perl引擎而混淆了这个问题,许多答案都在Perl中(在我的情况下不能使用).不过我在下面发布了我的解决方案.
2008.08.27 08:04:21 (Wed)------------Start of Session----------------- Blat v2.6.2 w/GSS encryption (build : Feb 25 2007 12:06:19) Sending stdin.txt to foo@bar.com Subject: test 1 Login name is foo@bar.com The SMTP server does not require AUTH LOGIN. Are you sure server supports AUTH? The SMTP server does not like the sender name. Have you set your mail address correctly? 2008.08.27 08:04:24 (Wed)-------------End of Session------------------ 2008.08.27 08:05:56 (Wed)------------Start of Session----------------- Blat v2.6.2 w/GSS encryption (build : Feb 25 2007 12:06:19) Error: Wait a bit (possible timeout). SMTP server error Error: Not a socket. Error: Not a socket. 2008.08.27 08:06:26 (Wed)-------------End of Session------------------ 2008.08.27 08:07:58 (Wed)------------Start of Session----------------- Blat v2.6.2 w/GSS encryption (build : Feb 25 2007 12:06:19) Sending stdin.txt to foo@bar.com Subject: Lorem Update 08/27/2008 Login name is foo@bar.com 2008.08.27 08:07:58 (Wed)-------------End of Session------------------
moritz.. 7
Kyle的答案可能是最有意义的,但是如果你把它全部放在一个字符串中并且想要使用单个正则表达式,那么这是一个(经过测试的)解决方案:
(第二次更新:修复了一下,现在比以往更具可读性;-)
my $re = qr{ ( # capture in $1 (?: (?!\n\n). # Any character that's not at a paragraph break )* # repeated error (?: (?!\n\n). )* ) }msxi; while ($s =~ m/$re/g){ print "'$1'\n"; }
丑陋,但你要求它.
Kyle的答案可能是最有意义的,但是如果你把它全部放在一个字符串中并且想要使用单个正则表达式,那么这是一个(经过测试的)解决方案:
(第二次更新:修复了一下,现在比以往更具可读性;-)
my $re = qr{ ( # capture in $1 (?: (?!\n\n). # Any character that's not at a paragraph break )* # repeated error (?: (?!\n\n). )* ) }msxi; while ($s =~ m/$re/g){ print "'$1'\n"; }
丑陋,但你要求它.
看起来您的会话是由空行分隔的(除了开始/结束标记).如果是这种情况,这是一个单线:
perl -ne 'BEGIN{$/=""} print if /error/i' < logfile