如何从日志文件中grep特定错误及其多行描述,并在Linux中的新日志文件中输出



基本上,我想根据关键字从日志文件中grep特定类型的错误及其多行描述。例如,日志文件可能类似于以下

1  Error - [KEYWORD1] Short description
2  Description
3  Description
4  Description
5
6  Error - [KEYWORD2] Short description
7  Description
8  Description
9  Description
10 
11 Error - [KEYWORD1] Short description
12 Description
13 Description
14 Description

每个错误都由一个特定的关键字定义,错误由一行新行分隔。有没有办法只将[KEYWORD1]类型的错误及其描述一起grep,并将其输出到新的日志文件中?

预期输出:

1  Error - [KEYWORD1] Short description
2  Description
3  Description
4  Description
5  Error - [KEYWORD1] Short description
6  Description
7  Description
8  Description

我试过类似的东西

grep-E";KEYWORD1";filename|sort|tee-new_errorlog.log

但这只会让我回第一行,没有描述。请注意,描述中有错误ID/错误位置的详细信息,因此使用排序的原因以及需要它们的原因。我对Linux有点陌生。因此,我们非常感谢您的帮助!干杯

*注意:行号不是文件的一部分

使用GNU sed:

sed -n '/[KEYWORD1]/,/^$/p' file

输出:

错误-[KEYWORD1]简短描述描述描述描述错误-[KEYWORD1]简短描述描述描述说明

^$与空行匹配。

Cyrus的sed方法简单有效,但我认为我应该使用awk来实现这一点,因为通常更容易调整您的条件。

awk '$1=="Error" && /KEYWORD1/ { s=1 } /^$/ { s=0 } s' file

这使用信号量或开关s来确定行是否应该打印。一个带有适当关键字的错误行将打开开关,而一个空行将关闭开关

如果你可能遗漏了空行,你可以做这样的事情:

awk '$1=="Error" { s=0 } $1=="Error" && /KEYWORD1/ { s=1 } s' file

这使用了与以前相同的条件来打开开关,但使用错误行(有或没有关键字(来关闭它

你可以在稍微复杂的条件下应用同样的逻辑,以使事情更有弹性或更可靠。

最新更新