Awk
過濾日誌文件
我試圖通過功能過濾我的日誌文件例如:
195.xx.x.x - - [13/Apr/2017:09:60:xx +0200] "POST /userx/index.php?m=contacts&xxxx... 192.xx.x.x - - [13/Apr/2017:09:45:xx +0200] "POST /userx/index.php?m=customer&xxxx... 197.xx.x.x - - [13/Apr/2017:09:10:xx +0200] "POST /userx/index.php?m=meeting&xxxx... 197.xx.x.x - - [13/Apr/2017:09:20:xx +0200] "POST /userx/index.php?m=dashboard&xxxx...
在這種情況下,我的功能是聯繫人、客戶、會議、儀表板,我嘗試忽略預設情況下的歡迎頁面。我用了
awk '$7 !~ /m=dashboard/ ' log file
我的問題是我是否可以忽略文件中的更多功能?
cat file: dashboard meeting
為了有這幾行:
195.xx.x.x - - [13/Apr/2017:09:60:xx +0200] "POST /userx/index.php?m=contacts 192.xx.x.x - - [13/Apr/2017:09:45:xx +0200] "POST /userx/index.php?m=customer
sed '/\//!{H;d};G;/m=\(.*\)\n.*\1/d;P;d' file log
說明:首先
file
使用過濾器關鍵字讀取,然後是日誌文件。包含 no 的行/
被解釋為關鍵字並附加到保留空間 (H
)。其他行獲得附加的保留空間 (G
),如果在m=
關鍵字列表 (/m=\(.*\)\n.*\1/d
) 中重複之後的關鍵字,則將其刪除。如果不是,則列印時沒有附加的保留空間 (P
)。
由於您的問題現在似乎更有意義,我認為您正在尋找這樣的東西:
awk -F= 'NR==FNR{l[$NF]=1; next} { if (!l[$NF]) print;}' ignore_words your_log_file
編輯
正如 Sundeep 在上面的評論中指出的那樣,您可以使用 grep 如下:
grep -Fvf ignore_words log_file
要查看這些選項
-Fvf
的用途,請查閱man grep
頁面。