2014-07-07 108 views
0

團隊,分隔每個grep發現記錄的分隔符

我有幾個例外引發到日誌文件。 Iam使用以下正則表達式從日誌中派生所有異常和錯誤。

現在,我想收集每個異常堆棧跟蹤消息,之後說10行,10行後幾行。我可以通過添加-A 10 -B 10來實現,但「我希望每個這樣的例外日誌記錄(10行之前,異常跟蹤,10行之後)通過」\ n「它們之間的分隔符,以便我可以分別收集每個這些塊並在UI中顯示。任何幫助?

grep「ERROR \ | FATAL \ | Exception \ | at。.java \ :.」my.log。

在此先感謝! Santhosh

回答

0

或者,你可以做到這一切在awk

awk '{r[FNR]=$0} /pattern/{w[++i]=FNR} END{for(j=1;j<=i;j++){for(k=w[j]-10;k<=w[j]+10;k++)if(k>0 && k<=FNR)print r[k];printf "\n"}}' logfile 

重要:您需要刪除的字pattern,把你的搜索字符串代替它。

在所述第一對大括號({})的代碼保存輸入文件的每行中排列R [1],R [2],R [3]等想到r[]作爲文件的RECORDS

下一對花括號中的代碼僅在符合您的搜索模式的行上激活,並且在那裏我記得數組w [1],w [2]中匹配行的行號。 w[]作爲行WANT

最後一組大括號中的代碼在yur輸入文件的末尾被激活......它通過你想要的w[]行數組,然後開始另一個循環10行,直到行後10行你想打印出這些行,然後用你想要的那個重要的空白行跟着它們。

+0

Mark,我正在使用模式(^ [\ tException])來檢索堆棧跟蹤,但我想要的是在堆棧跟蹤之前檢索10行,堆棧跟蹤,堆棧跟蹤之後的10行作爲單個記錄,然後顯示每個這些記錄(這我會照顧),目前它打印堆棧跟蹤================== awk'{r [FNR] = $ 0}/^ [ (j = 1; j <= i; j ++){for(k = w [j] -10; k <= w [j] +10 ; k ++)if(k> 0 && k <= FNR)print r [k]; printf「\ n」}}'my.log – Santhosh

+0

我無法從中很容易地判斷髮生了什麼。請嘗試使用一個非常小的'awk'命令,如下所示,這樣我們就可以得到一些可行的東西,然後構建它,直到它做到你想要的東西...'awk'/ Exception/{print}'my.log ' –

+0

Thx我用你的例子讓它工作 – Santhosh

0

你可以做這樣的事情:

#!/bin/bash 
N=10 
pattern=xyz 
matchinglines=($(awk -v p="$pattern" '$0~p{print NR}' logfile)) # Generate array of matching line numbers 
for x in ${matchinglines[@]} 
do 
    ((start=x-N)) 
    [[ $start -lt 1 ]] && start=1 # Avoid passing negative line numbers to sed 
    ((end=x+N)) 
    sed -ne "${start},${end}p" logfile 
    echo 
done