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