Awk
過去 30 分鐘的日誌文件 grep 條目
我正在創建一個腳本,該腳本將通過電子郵件發送日誌中的錯誤/警告。我想每半小時發送一次,但我只想在有新條目時發送。我如何才能找出最後半小時的錯誤?
日誌中的時間戳採用以下格式。
< 2016 年 8 月 1 日 2:15:29 PM MDT> < 錯誤詳情…..>
到目前為止的腳本是:
#!/bin/bash cat /var/log/logfile.log | egrep -i "error|warning" | tee -a /tmp/log.tmp "get only last 30 min of errors" | mail -s "Errors/Warning" user@email.com
是否可以將時間戳(2016 年 8 月 1 日下午 2:15:29 MDT)轉換為紀元時間,然後將其與目前紀元時間進行比較,或者有沒有辦法使用 sed/awk/perl 獲得最後 30 分鐘?
對於轉換到紀元,您可以使用以下語句:
# date +%s -d"Aug 1, 2016 2:15:29 PM MDT" 1470082529
要將紀元轉換為 UTC,您可以使用:
# date -d @1470082529 Tue Aug 2 00:45:29 IRDT 2016 #### on Linux Box # date -r 1470082529 Tue Aug 2 00:45:29 IRDT 2016 ###on BSD box
我會使用
perl
’sFile::Tail
模組。我現在沒有時間寫一個例子,但是在 perlish 虛擬碼中,它看起來像這樣:#! /usr/bin/not-actually-perl use strict; use File::Tail; use Net::SMTP or Mail::Mailer or one of the squillion other perl mail sending modules; open a File::Tail file handle to your log file my $now=time(); my @lines = (); while (read the File::Tail handle) { push @lines, $_; if (time() > ($now + 1800 seconds) ) { $now=time(); email the @lines array to you@your.address; @lines=(); } }
一個實際的工作腳本可能比上面的腳本長不到 10 行,其中大部分是設置電子郵件的標題。
還有幾行來擷取各種信號,以便在暫停或退出之前通過電子郵件發送它現在在@lines 中的內容。
有關詳細資訊,請參閱
File::Tail
和Net::SMTP
(或其他)的手冊頁。