Parsing 如何在每一行的上方打印10行,直到下方有一个匹配的单词?

Parsing 如何在每一行的上方打印10行,直到下方有一个匹配的单词?,parsing,sed,terminal,grep,Parsing,Sed,Terminal,Grep,我需要解析日志文件,以便输出错误(下面是堆栈跟踪),每个错误上方有10行 例如: 2017-10-29 00:00:10440信息… 2017-10-29 00:00:10473警告… 2017-10-29 00:00:10504信息… 2017-10-29 00:00:10547信息… 2017-10-29 00:00:10610信息… 2017-10-29 00:00:11176警告… 2017-10-29 00:00:11894警告.. 2017-10-29 00:00:11900信息…

我需要解析日志文件,以便输出错误(下面是堆栈跟踪),每个错误上方有10行

例如:

2017-10-29 00:00:10440信息…
2017-10-29 00:00:10473警告…
2017-10-29 00:00:10504信息…
2017-10-29 00:00:10547信息…
2017-10-29 00:00:10610信息…
2017-10-29 00:00:11176警告…
2017-10-29 00:00:11894警告..
2017-10-29 00:00:11900信息…
2017-10-29 00:00:11900信息…
2017-10-29 00:00:12632警告…
2017-10-29 00:00:12946错误…
…(堆栈跟踪)…
…(堆栈跟踪)…
…(堆栈跟踪)…

2017-10-29 00:00:12946警告

我需要在错误上方输出10行,直到下面的日期(2017-10-29)(不包括日期行)


考虑过使用grep-n-B10“ERROR”(用于上面的10行)和sed'/ERROR/,/29/p'(用于堆栈跟踪)来实现这一点,但是如何将两者结合起来呢

使用
grep
+
管道:

grep -B10 'ERROR' g1 | head -n -1
这可能适用于您(GNU-sed):


在模式空间中最多收集10行,然后将这些行用作文件中的移动窗口。当遇到字符串
错误
时,打印窗口,然后打印任何其他行,直到(但不包括)字符串
2017-10-29
匹配。如有必要,重复上述步骤。

以下是使用awk的一种方法:

awk '                     {a[++b]=$0}
     /^([0-9]{2,4}-?){3}/ {f=0}
     /ERROR/              {f=1; for(i=NR-10;i<NR;i++) print a[i]}
     f' file
awk'{a[++b]=$0}
/^([0-9]{2,4}-?){3}/{f=0}
/错误/{f=1;对于(i=NR-10;i试试这个

grep -no -B10 ' [0-9:,]* ERROR.*' infile

可能需要将“”替换为[[:blank:]

我想不出一种组合它们的方法,但编写一个bash脚本作为独立任务来完成这项任务相对简单,不使用grep或sed。@RomanPerekhrest,如果我在日志文件中有很多错误,它会起作用吗?我想head只会修剪管道数据的最后一行。.我错了吗?@RuthieZ,你没有告诉我注意日志文件有许多错误此
grep | head
不打印堆栈跟踪行,不管文件中有多少错误。问题是最后十行和要提取的错误堆栈跟踪。
grep -no -B10 ' [0-9:,]* ERROR.*' infile