2011-03-28 152 views
1

在我的日志文件条目中记录了开始和结束标记。像下面正则表达式需要帮助

WY_LOG_TYPE_ERROR < < **
这是第一个错误
等等 - 等等 - 等等
** >>

WY_LOG_TYPE_ERROR < < **
这是第二个错误
嗒嗒 - blah - blah
** >>

WY_LOG_TYPE_ER ROR < < **
这是第三个错误
等等 - 等等 - 等等
** >>

在任何给定的时间说上述3项有没有在日志文件中。
我想要一个正则表达式只匹配最后一个条目。

目前我使用的是下面的REG-EXP:
WY_LOG_TYPE_ERROR \ S * < < \ * \ *((| \ n)*)\ * \ * >> $

现在$ 1包含第一个条目的开始标记和最后一个条目的结束标记之间的每一件东西。
我想要的是最后一项的开始和结束标记之间的内容。我不关心其他条目。

任何人都可以请修改这个reg-exp来满足我的需求。

编辑:我用perl REG-EX

编辑:我需要为我使用SEC错误日志处理使用REG-EXP。

回答

1

你需要做一个“非贪婪的”匹配。默认情况下,*是贪婪的,这意味着它会尽可能匹配。大多数语言使用*?表示非贪婪或最短匹配。

0

这可能是因为您正在根据regex to match EOF寻找\z以匹配文件结束。

WY_LOG_TYPE_ERROR\s*<<\*\*((.|\n))\\*>>\z 

(未经测试)

1

您还可以使用负前瞻断言,这是最后的日志记录:

m/WY_LOG_TYPE_ERROR <<\*\*(?!.*WY_LOG_TYPE_ERROR <<\*\*)(.*)\*\*>>/s 

首先找到该记录头,那么你就断言,有在这个文件中没有更多的记录标题,并且最终以$ 1捕获真正的消息。

结果将是:

This is the third error 
blah - blah - blah 

整个Perl的将是:

if ($logfile =~ m/WY_LOG_TYPE_ERROR <<\*\*(?!.*WY_LOG_TYPE_ERROR <<\*\*)(.*)\*\*>>/s) { 
    $last_record = $1; 
} else { 
    $last_record = ""; 
} 
+0

现在我使用的是下面的REG-EXP:(?S)WY_LOG_TYPE_ERROR \ S * << \ * \ *(?!。* WY_LOG_TYPE_ERROR)(。*)\ * \ * >> $但是这是在$ 1中选择整个第三个条目两次。有什么想法吗? – Varun 2011-03-28 14:16:32

2

为什么要使用正则表达式时,您的字符串匹配的大部分是简单的线性搜索?

这可以通过只使用最后一个子搜索WY_LOG_TYPE_ERROR

例如,在JavaScript(虽然这将是实现简单,几乎在我能想到的任何语言)

var log = "WY_LOG_TYPE_ERROR <<** ... **>>", 
    last = log.substr(log.lastIndexOf("WY_LOG_TYPE_ERROR")); 
更简单的解决

这很简单吗?更不用说更快,因为lastIndexOf从字符串的末尾开始(这将对任意大的日志字符串/文件/流进行缩放),并且我们不需要构建状态机(即构建正则表达式)。

+0

我希望我能给出超过+1的建议。 – 2011-03-28 12:17:05

+0

我没有别的选择,只能使用正则表达式。我使用SEC(http://simple-evcorr.sourceforge.net/man.html)进行日志监控。 – Varun 2011-03-28 12:25:19

0

这里是一个办法做到这一点:

#!/usr/bin/perl 
use strict; 
use warnings; 

my $err; 
while(<DATA>) { 
    $err ='' if (/^WY_LOG_TYPE_ERROR <</); 
    $err .= $_ if (/^WY_LOG_TYPE_ERROR <</ .. /^\*\*>>/); 
} 
print $err; 

__DATA__ 
WY_LOG_TYPE_ERROR <<** 
This is the first error 
blah - blah - blah 
**>> 

WY_LOG_TYPE_ERROR <<** 
This is the second error 
blah - blah - blah 
**>> 

WY_LOG_TYPE_ERROR <<** 
This is the third error 
blah - blah - blah 
**>> 

输出:

WY_LOG_TYPE_ERROR <<** 
This is the third error 
blah - blah - blah 
**>>