2010-09-18 39 views
5

我有在日誌目錄中的多個訪問日誌,下面的命名約定如下:如何將多個日誌文件視爲Perl中的一個虛擬文件?

access.log.1284642120 
access.log.1284687600 
access.log.1284843260 

基本上,日誌是「旋轉」,由每天的Apache,這樣他們就可以在順序排序。

我試圖「一個接一個地閱讀它們」,以便它們可以被視爲一個日誌文件。

my @logs = glob('logs/access.log.*'); 

上面的代碼將所有glob的日誌,但我不知道:

  • 以何種順序將日誌組織,按字母順序?
  • 如果我想檢查「來自獨特IP的最新訪問時間」,我該怎麼做?

我有一個Perl腳本,可以讀一個單一的訪問日誌,方便地檢查這個(我的算法是有它使用IP地址作爲密鑰和訪問時間值大的亂碼,只是不停推鍵/值對...)。 但我不想只將這個過程中的所有訪問文件合併到一個臨時文件中。

有什麼建議嗎?提前謝謝了。

回答

11

如果你想確保一個特定的順序,排序它自己,哪怕只是爲了保證自己,它會出來的權利:

my @files = sort { ... } glob(...); 

在這種情況下,這裏的文件名是除了都一樣具體的數字,你可能不需要那種塊:

my @files = sort glob(...); 

讀他們作爲一個尤伯杯文件,我喜歡用local @ARGV這樣我就可以使用鑽石操作符,它實際上只是魔術ARGV文件句柄。當它到達@ARGV中的一個文件的末尾時,它將轉到下一個文件。這假貨通過程序內分配給@ARGV指定命令行上的所有文件:

{ 
local @ARGV = sort { ... } glob(...); 

while(<>) { 
     ...; 
     } 
} 

如果您需要知道您目前正在處理的文件,看在$ARGV

如果你需要更多的東西,你可能不得不採取暴力手段。

+1

+1標點。就像金屬樂隊一樣,SO的回答對變音器來說更好。 – FMc 2010-09-18 12:09:09

+0

您還可以獲得'$ .'的魔力,跟蹤當前文件的當前行號。 – mob 2010-09-18 18:19:11

2

在Unix-Y的環境中,你可以將文件利用殼組合到一起:

my @files = glob("$dir/access.log.*"); 
open my $one_big_logfile, "-|", "cat @files" or die ...; 
while (<$one_big_logfile>) { 
    ... 
} 
相關問題