[英]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.