2014-07-07 57 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