我想将日志文件分成几部分,然后在这些部分中搜索错误。如果出现错误,我想将相关的日志文件片段放入另一个文件中。
小例子:
日志文件如下所示:
STARTLOG1
blabla
more_blabla
ENDLOG1
STARTLOG2
错误:Errortext这是 用户 XYZ 发出的
错误 ENDLOG2 STARTLOG3 blabla more_blabla ENDLOG3
我想将日志文件分成几部分。 STARTLOG 和 ENDLOG 之间的所有行都应该是 1 条。当片段中出现错误时,将整个片段提取到文件中。该文件应如下所示:
STARTLOG2
错误:Errortext这是 用户 XYZ ENDLOG2 的
错误
答案1
尝试这个:
$ awk -v RS="STARTLOG" '/ERROR/{print RS$0; }' log
STARTLOG2
ERROR: Errortext
This is an Error
from user XYZ
ENDLOG2
要重定向到名为 的文件(logN
其中 N 是来自的数字)STARTLOG
,请使用:
gawk -v RS="STARTLOG" '/ERROR/{print RS$0 > "log"$1; }' log
解释
RS
是记录分隔符,它定义了“行”的含义awk
。在这里,我将其设置STARTLOG
为将整个记录视为一行。然后,如果该“行”包含ERROR
,我将打印STARTLOG
(RS
,这只是为了重新创建相同的格式)。
您还可以对 Perl 使用相同的方法:
perl -lne 'BEGIN{$/="STARTLOG"}{print "$/$_" if /ERROR/}' log