0

我有一个非常大的日志文件,它会定期更新。如下:

commands: (List of files to be copied)
Exit time: Fri May 10 05:33:00 2013
Exit status: 2

commands: (List of files to be copied)
Exit Time: Fri May 20 05:34:00 2013
Exit status: 2

commands: (List of files to be copied)
Exit Time: Fri May 30 05:50:00 2013
Exit Status: 1

我有以下代码,它根据退出状态创建哈希

while ($line = <FH>) {
        if ($line =~ /Exit time/) {
        ($exittime, $exittimeval) = split(': ',$line);
         $stat{$qbsid} = {
            time     => $exittimeval
            };
}

我现在需要根据本地时间创建一个时间戳,以便脚本不会比较时间戳(本地时间)之后的时间的日志文件。我有代码来比较时间如下

 $date1 = "$hr1:$min1:$sec1, $moy1/$dt1/$yr1";
 $date2 = "$hr2:$min2:$sec2, $moy2/$dt2/$yr2";
 sub to_comparable {
    my ($date) = @_;
    my ($H,$M,$S,$d,$m,$Y) = $date =~ m{^(\d+):(\d+):(\d+), (\d+)/(\d+)/(\d+)\z}
      or die;
    return "$Y$m$d$H$M$S";
}

if (to_comparable($date2) > to_comparable($date1)) {
print "right\n";
} else {
        print "wrong \n";
}

这里 $hr1,$min1,$sec1,$moy1,$dt1 和 $yr1 是本地时间变量,而 $hr2,$min2,$sec2, $moy2,$dt2 和 $yr2 是从哈希中获得的值。

最好在第一次运行时比较整个文件并创建时间戳。之后,上面的想法就开始了。

如果有任何问题,请纠正我。谢谢你。

4

2 回答 2

2

您可能要考虑使用Time::Piece,它是首次与 perl v5.9.5 一起发布的。

#!/usr/bin/perl
use strict;
use warnings;
use Time::Piece;

{
    my $end_date = '2013-05-30';

    local $/ = '';
    while (<DATA>) {
        if (/^Exit Time: (.+)/m) {
            my $date = Time::Piece->strptime($1, "%c");
            print $date->ymd, "\n" if $date->ymd lt $end_date;
        }
    }   
}

__DATA__
commands: (List of files to be copied)
Exit Time: Fri May 10 05:33:00 2013
Exit status: 2

commands: (List of files to be copied)
Exit Time: Fri May 20 05:34:00 2013
Exit status: 2

commands: (List of files to be copied)
Exit Time: Fri May 30 05:50:00 2013
Exit Status: 1

输出:

2013-05-10
2013-05-20
于 2013-08-21T01:47:57.453 回答
0

您将形成一个 20 位数的数字(假设年份是 4 位数,其余的总是正好是 2 位数)。这是一个很大的数字,但在我的 64 位 UNIX 操作系统上似乎还不错;我不知道你的。无论如何,对于固定长度的字符串,如果一个大的数字是一个问题,您可以进行字符串比较(“ge”而不是“>”)。

如果任何输入(例如 $moy1)可能是单个数字,那么您的比较功能将不起作用,因为 10 月 1 日(2013101)将在 9 月 30 日(2013930)之前。您可以使用以下方法要求固定位数:

my ($H,$M,$S,$d,$m,$Y) = $date =~ m{^(\d\d):(\d\d):(\d\d), (\d\d)/(\d\d)/(\d\d\d\d)\z}
      or die;

我确定 $qbsid 是如何设置的(来自退出状态或其他),但由于您的代码不完整,我假设您还有其他事情要做。

我也不确定您的原始时间字符串(例如“Fri May 30 05:50:00 2013”​​)如何转换为“$hr1:$min1:$sec1, $moy1/$dt1/$yr1”格式,但我假设你在其他地方也这样做。

于 2013-08-21T01:24:56.540 回答