0

我在 log.txt 文件中有一个日志文件,我想用最新登录的用户名排序

示例 - 如果用户 PAUL 有 2 次登录 1 月和 1 次登录 2 月,则应采用 2 月登录详细信息(作为 PAUL 的最后一次登录)

输入文件:log.txt--

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

输出文件-

Administrator-26/03/2013
4

3 回答 3

1

如果您可以将日期转换为 ISO 格式,则可以对其使用简单的字符串比较。请参阅ISO 8601 上的 xkcd

#!/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";
于 2013-04-29T08:37:25.450 回答
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
于 2013-04-29T08:50:31.613 回答
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

自动拆分 - 并根据最大日期填充哈希

输出是“反向”日期顺序,因为这就是我用来比较的

于 2013-04-29T08:44:05.620 回答