we don't have so much lines recently in the file, but here is the continuous 3 lines in the file:
10-Oct-02 12:23:48 utkill main info
OTH INF Error Return From gpsetprv
10-Oct-02 12:24:04 utwdog clean_up info
OTH INF Normal Termination
10-Oct-02 12:24:05 netin clean_up info
OTH INF Normal Termination
I need, actually, compare current time with the date/time at the beginning of each line. and if the different is less than 6 hours, then do something else.
Here is a Perl routine that can tell if two dates, formatted as in your file, are within six hours of each other, so long as the dates are all within the 21st century:
#!/usr/bin/perl
use POSIX;
use strict;
my %months;
$months{"jan"} = 0;
$months{"feb"} = 1;
$months{"mar"} = 2;
$months{"apr"} = 3;
$months{"may"} = 4;
$months{"jun"} = 5;
$months{"jul"} = 6;
$months{"aug"} = 7;
$months{"sep"} = 8;
$months{"oct"} = 9;
$months{"nov"} = 10;
$months{"dec"} = 11;
# are_dates_within_six_hours - Determine if two dates are within six hours
#
# usage: $boolean = are_dates_within_six_hours($date1, $date2);
#
# This function determines if two dates are within six hours of each
# other, and returns 1 or 0 accordingly.
#
# The dates are formatted as follows:
#
# DD-Mnt-YY HH:MM:SS
#
#
# Which date is later or earlier does not matter.
sub are_dates_within_six_hours
{
my ($date1, $date2) = @_;
my @times;
foreach($date1, $date2)
{
# Parse the date.
my $day;
my $month;
my $year;
my $hour;
my $min;
my $sec;
if($_ =~ /(\d*)-([[:alpha:]]*)-(\d*)\s*(\d*):(\d*):(\d*)/)
{
$day=$1;
$month = $months{lc $2};
$year=$3;
$hour=$4;
$min=$5;
$sec=$6;
# Horrible bug: The dates you're using use
# two-digit years! I'll blindly
# assume that all your dates
# are in the 21st century or later.
$year += 100;
}
else
{
die "$_: Does not conform to expected format\n";
}
# Convert the time into Unix's time_t value.
push @times, mktime($sec, $min, $hour, $day, $month, $year);
}
# 21600 seconds in six hours.
return (abs($times[0] - $times[1]) <= 21600);
}