2011-09-23 38 views
0

我想分析一些日誌的一些使用統計信息。 基本上我想要做的是使用正則表達式來緩解分析的痛苦如何使用正則表達式分析日誌文件?備擇方案?

所以我有一些日誌沿着這

2011-09-17 09:16:33,531 INFO [someJava.class.special] sendRequest: fromGevoName=null, ctrlPageId=fooBar, actionId=search, 
2011-09-17 09:16:33,976 INFO [someJavaB.class] fooBar 
2011-09-17 09:16:33,982 DEBUG [someOtherJava.class] abc blabala 
2011-09-17 09:16:33,987 INFO [someJava.class.special] sendRequest completed: fromGevoName=XYZ, toPageId=fooBar, userId=someUser 

.... 我想指望所有出現一個文本文件詞語在此情況下foobar的並且僅該事件位置

[someJava.class.special] ctrlPageId=....

。有許多不同的fooBar,我想要統計一次發生的頻率。

我的想法是與匹配組更換和重複的東西沿着這

((?s).*\[someJava.class.special\] sendRequest: fromGevoname=.* ctrlPageId=([^,]*)(?-s).*)* 

,並與匹配組\2

取代它之後在Excel中分析列表。 但我的greptool不重複正則表達式,它只匹配一次。我使用grepWin,可能有不同的工具/正則表達式嗎?

那麼它基本上是一個wingrep或grepwin的問題。如果重複使用它,修飾符(?s)可以在點上打斷或禁用它(?-s)。

([\n-\[\(\]\.,:0-9a-zA-Z]).*\[someJava.class.special\] sendRequest: fromGevoname=.* ctrlPageId ([^,]*)(?-s).* 

所以基本上我有可能發生,包括換行字符串中的所有符號交換的第一linebreakmatching點: 所以我沿着這東西交換的正則表達式。它的工作原理...我敢肯定有一個更好的解決方案,始終是敞開的這

+0

我不明白你的要求。你是否願意得到所有包含'[someJava.class.special] sendRequest:fromGevoname = ANYTHING ctrlPageId = ANYTHING'或將任何東西替換爲某些東西的行? – Kent

+0

我願意得到所有包含ctrlPageId = ANEYING – Toskan

+1

的行然後不'grep -E「ctrlPageId =。*」file'給你所有行? – Kent

回答

1

我不知道我的理解,但如果你正在尋找的輸出是:
someJava fooBar

喜歡的東西這應該工作(PHP腳本):

<?php 
$log = file_get_contents('file.log') 
preg_match_all("#\[(?<className>\w+)\.class(.special)?\](.*?)ctrlPageId=(?<controllerName>\w+)#i", $log, $m); 

for ($i=0; $i < count($m[0]); $i++) { 
    echo $m['className'][$i] . ' ' . $m['controllerName'][$i] . "\n"; 
} 
+0

我相信PHP很酷,但我不使用它。我用解決方案更新了我的問題 – Toskan