通过分隔符分隔每个grep找到的记录

时间:2014-07-07 11:58:33

标签: grep

我向日志文件抛出了一些例外。我使用以下正则表达式从日志中派生所有异常和错误。

现在,我想收集每个异常堆栈跟踪消息,之前说几行10行,10行之后。我能够通过添加-A 10 -B 10,"但是"我希望每个这样的异常日志记录(之前的10行,异常跟踪,之后的10行)被说出" \ n"或者某些东西作为它们之间的分隔符,这样我就可以分别收集每个块并在ui中显示。有什么帮助吗?

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

提前致谢! Santhosh

2 个答案:

答案 0 :(得分: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

答案 1 :(得分: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]等中。想想{{1} }作为您文件的r[]

下一对花括号中的代码仅在与搜索模式匹配的行上激活,并且在那里我记得数组w [1],w [2]等中匹配行的行号。 RECORDS作为行w[]

最后一组花括号中的代码在yur输入文件的末尾激活...它会遍历你想要的WANT行数组,然后在10行前开始另一个循环10行在您希望打印出这些行之后,然后使用您想要的那条非常重要的空行跟随它们。