我想將日誌檔案分成幾部分,然後在這些部分中搜尋錯誤。如果發生錯誤,我想將相關的日誌檔案片段放入另一個檔案。
小例子:
日誌檔如下所示:
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