2011-03-28 211 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 
**>>