2013-04-29 29 views
0

我在log.txt文件一個日誌文件,我想排序與最新的登錄用戶名Perl程序利用最新登錄

例 - 如果用戶保羅2個登錄一月和一個登錄二月份應採取 二月的登錄信息(至於保羅最後一次登錄)

輸入文件:log.txt--

Administrator-25/02/2013 
Administrator-26/03/2013 

輸出FILE-

Administrator-26/03/2013 
+2

[perl程序利用最新登錄的所有用戶]的可能重複(HTTP://計算器。 com/questions/16273185/perl-program-taking-the-latest-login-for-all-users) – dgw 2013-04-29 08:33:37

+1

所以這是一個日誌文件,在這些日誌文件中添加了條目?是否有任何理由懷疑參賽作品沒有按日期排序?換句話說,是否有任何理由最後一次入境不會是最近的? – TLP 2013-04-29 09:48:37

+0

雖然這個問題與被引用作爲可能重複的問題密切相關,但另一個問題是關閉和刪除的,所以它根本不是一個好的「確切重複」。這個問題相當簡單,尤其是當被分析的文件看起來是一個常規的日誌文件時,它將包含給定的最新條目作爲所述用戶的最後一個條目,所以只需要讀取條目並保持最新記錄每個用戶。 – 2013-05-01 04:43:08

回答

1

如果您可以將日期轉換爲ISO格式,則可以使用簡單的字符串比較。請參閱xkcd on ISO 8601

#!/usr/bin/perl 
use warnings; 
use strict; 

sub later { 
    my @dates = @_; 
    for my $date (@dates) { 
     $date = join '/', (split m(/), $date)[2, 1, 0]; # Fix StackOverflow's syntax highlighting:/
    } 
    return $dates[0] lt $dates[1]; 
} 

my @lines = qw(Administrator-25/02/2013 
       Administrator-26/03/2013 
       Guest-01/01/2012 
       Administrator-01/01/2012 
      ); 

my $user = 'Administrator'; 
my $last = q(); 

for my $line (@lines) { 
    next unless 0 == index $line, "$user-"; 
    my $date = (split /-/, $line, 2)[1]; 
    $last = $date if later($last, $date) 
} 

print "$last\n"; 
0

爲微超長一個襯墊

perl -F\- -l -a -n -e ' $d=join(q(/),reverse split(q(/), $F[1])); $l{$F[0]}=$d if (!exists($l{$F[0]}) || $l{$F[0]} lt $d); END{ for (sort keys(%l)) { $v=$l{$_}; print "$_-",$l{$_} }}' logfile.txt 

自動分割上 - 並填充基於最大日哈希

輸出是「反向」日期順序因爲這是我用什麼比較

0

使用Unix時間比較日期:

#!/usr/bin/perl 
use strict; 
use warnings; 
use POSIX qw(mktime); 
$\="\n"; 

open my $fh, '<','log.txt' or die $!; 
my %h1; 
while(<$fh>){ 
     chomp; 
     my ($user,$date,$mon,$year)=split(/[\/-]/); #Split record 
     my $tm=mktime(0,0,0,$date,$mon-1,$year-1900); # Calculate the epoch 
     if (!exists$h1{$user} or ($h1{$user}<$tm)){ # store the bigger value in hash with the use as the key 
       $h1{$user}=$tm; 
     } 
} 
# Sort the hash on the basis of the key and print it 
foreach my $k (sort keys%h1){ 
     my @val=localtime($h1{$k}); 

     $val[4]+=1; 
     $val[5]+=1900; 
     print $k,'-',join "/",@val[3..5]; 
} 

輸入文件(log.txt的):

Administrator-25/02/2013 
Administrator-26/03/2013 
Administrator-27/02/2013 
xyz-31/01/2013 
xyz-31/03/2013 

在運行該腳本:

xyz-31/3/2013 
Administrator-26/3/2013 
+0

非常感謝。現在,我該如何根據字母順序對輸出條目進行排序。 – user2223511 2013-04-29 10:55:55

+0

更新了代碼以獲得排序順序... – Guru 2013-04-29 11:08:11

+0

感謝您的支持。 – user2223511 2013-04-29 13:10:01