队
我向日志文件抛出了一些例外。我使用以下正则表达式从日志中派生所有异常和错误。
现在,我想收集每个异常堆栈跟踪消息,之前说几行10行,10行之后。我能够通过添加-A 10 -B 10,"但是"我希望每个这样的异常日志记录(之前的10行,异常跟踪,之后的10行)被说出" \ n"或者某些东西作为它们之间的分隔符,这样我就可以分别收集每个块并在ui中显示。有什么帮助吗?
grep" ERROR \ | FATAL \ | Exception \ | at。 .java \:。" my.log。
提前致谢! Santhosh
答案 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行在您希望打印出这些行之后,然后使用您想要的那条非常重要的空行跟随它们。