我在 log.txt 文件中有一个日志文件,我想用最新登录的用户名排序
示例 - 如果用户 PAUL 有 2 次登录 1 月和 1 次登录 2 月,则应采用 2 月登录详细信息(作为 PAUL 的最后一次登录)
输入文件:log.txt--
Administrator-25/02/2013
Administrator-26/03/2013
输出文件-
Administrator-26/03/2013
我在 log.txt 文件中有一个日志文件,我想用最新登录的用户名排序
示例 - 如果用户 PAUL 有 2 次登录 1 月和 1 次登录 2 月,则应采用 2 月登录详细信息(作为 PAUL 的最后一次登录)
输入文件:log.txt--
Administrator-25/02/2013
Administrator-26/03/2013
输出文件-
Administrator-26/03/2013
如果您可以将日期转换为 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";
使用 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
作为一个稍微过长的一个班轮
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
自动拆分 - 并根据最大日期填充哈希
输出是“反向”日期顺序,因为这就是我用来比较的