2010-07-04 44 views
1

我目前有一個bash腳本,它解析/var/log/mail.log以確定imap用戶的最後登錄時間/日期。我已經確定Perl對於這項任務的效率和速度會更快,特別是隨着日誌的增長。解析/var/log/mail.log中的最後一個imap登錄時間

考慮下面的例子/var/log/mail.log文件:

Jul 5 06:57:54 mail-04 dovecot: imap-login: Login: user=<[email protected]>, method=PLAIN, rip=192.168.x.x, lip=192.168.x.x 
Jul 5 06:59:54 mail-04 dovecot: imap-login: Login: user=<[email protected]>, method=PLAIN, rip=192.168.x.x, lip=192.168.x.x 
Jul 5 06:59:59 mail-04 dovecot: imap-login: Login: user=<[email protected]>, method=PLAIN, rip=192.168.x.x, lip=192.168.x.x 
Jul 5 07:01:54 mail-04 dovecot: imap-login: Login: user=<[email protected]>, method=PLAIN, rip=192.168.x.x, lip=192.168.x.x 
Jul 5 07:01:59 mail-04 dovecot: imap-login: Login: user=<[email protected]>, method=PLAIN, rip=192.168.x.x, lip=192.168.x.x 

什麼是Perl中最有效的方式來打印每一個獨特的用戶最後登錄時間?例如。預期的輸出應該是:

[email protected] last imap-login: Jul 5 07:01:54 
[email protected] last imap-login: Jul 5 07:01:59 
+2

你一直說 「高效」。你什麼意思?你有一些特定的速度要求嗎?內存要求?如果沒有具體的要求,擔心「效率」是沒有意義的。 – 2010-07-04 22:00:00

+0

目前我每2分鐘運行一個bash腳本來更新一個數據庫(爲管理員提供訪問權限以查看員工上次登錄時的情況),這些都運行在專用系統日誌系統上,但我現在正處於集中對我的解析器腳本進行更新純粹是爲了高效,因爲我期望imap用戶的數量呈指數級增長。我所追求的是降低解析時花費的CPU時間。將整個文件加載到內存中是可以接受的,因爲日誌文件將每隔幾天旋轉一次,預計不會超過一百個這樣的兆字節(並且內存很便宜)。 – 2010-07-04 22:12:08

+0

建立在安迪·萊斯特的評論之上,我建議你推遲對效率的擔憂。先讓它工作,然後加快速度,但只有在必要時(只需從shell腳本切換到Perl可能會提供所需的性能提升)。一般來說,你將需要一個逐行的文本處理循環(不需要將整個文件存儲在內存中),一個簡單的正則表達式(用來攔截用戶名和登錄時間)以及一個用戶名爲鍵和最後一次登錄作爲值。如果在編寫該腳本時遇到任何障礙,StackOverflow將是一個很好的資源。 – FMc 2010-07-04 23:23:55

回答

1
perl -ne '$l{$2}=$1 if /^(.{15}) .* imap-login: Login: user=<([^>]+)>/; END { print "$_ last imap-login: $l{$_}\n" for keys %l }' /var/log/mail.log 
2

使用散列並繼續爲用戶名分配登錄時間聽起來像是一個簡單的解決方案。

$logins{$username} = $date