我目前有一個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
你一直說 「高效」。你什麼意思?你有一些特定的速度要求嗎?內存要求?如果沒有具體的要求,擔心「效率」是沒有意義的。 – 2010-07-04 22:00:00
目前我每2分鐘運行一個bash腳本來更新一個數據庫(爲管理員提供訪問權限以查看員工上次登錄時的情況),這些都運行在專用系統日誌系統上,但我現在正處於集中對我的解析器腳本進行更新純粹是爲了高效,因爲我期望imap用戶的數量呈指數級增長。我所追求的是降低解析時花費的CPU時間。將整個文件加載到內存中是可以接受的,因爲日誌文件將每隔幾天旋轉一次,預計不會超過一百個這樣的兆字節(並且內存很便宜)。 – 2010-07-04 22:12:08
建立在安迪·萊斯特的評論之上,我建議你推遲對效率的擔憂。先讓它工作,然後加快速度,但只有在必要時(只需從shell腳本切換到Perl可能會提供所需的性能提升)。一般來說,你將需要一個逐行的文本處理循環(不需要將整個文件存儲在內存中),一個簡單的正則表達式(用來攔截用戶名和登錄時間)以及一個用戶名爲鍵和最後一次登錄作爲值。如果在編寫該腳本時遇到任何障礙,StackOverflow將是一個很好的資源。 – FMc 2010-07-04 23:23:55