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
            };
}

スクリプトがログ ファイルをタイムスタンプ (localtime) の後の時間と比較しないように、localtime に基づいてタイムスタンプを作成する必要があります。次のように時間を比較するコードがあります

 $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

perl v5.9.5 で最初にリリースされたTime::Pieceの使用を検討することをお勧めします。

#!/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 に答える