繁体   English   中英

如何将 grep 特定错误及其来自日志文件的多行描述和 output 它放在 Linux 的新日志文件中?

[英]How to grep specific errors together with its multi-line description from a log file and output it in a new logfile in 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 错误及其描述和 output 写入新的日志文件?

预期 output:

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" 文件名 | 排序 | tee new_errorlog.log

但这只会返回我没有描述的第一行。 请注意,描述中有错误 ID/错误位置详细信息,因此为什么使用排序以及为什么需要它们。 我对 Linux 有点陌生。 所以任何帮助表示赞赏。 干杯。

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

使用 GNU sed:

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

Output:

Error - [KEYWORD1] Short description
Description
Description
Description

Error - [KEYWORD1] Short description
Description
Description
Description

^$匹配一个空行。

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

这使用与以前相同的条件来打开开关,但使用错误行的存在(带或不带关键字)将其关闭。

您可以在稍微复杂一点的条件下应用相同的逻辑,以使事情更具弹性或可靠性。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM