compare two dates

I have a log file with date format like

10-Oct-02 13:20:29 .....

at the beginning of each line in the log file, and I need to grep data from this file to list the lines with date no longer than one days.

I tried to use awk to do this but it looks very complicated to do it.

Is there anyone know any simpler method can do it?

post some of that file you want parsed in here so i can see the exact format and maybe i can work with that :slight_smile:

i want to see about 20 lines of it :slight_smile: that should do just fine. I can probably hack something up for you if you show me 20 lines of the file. . .

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.

Thanks,

a command which can subtract dates like this will help...

$ datediff 20020223 20020101
53
$ datediff 20020101 20020223
53

the order of dates should be unimportant...

also a program which can add days and give the new date like this

$ adddays 20020101 32
20020202

can write small C programs to do this.. should take care of leap years...

I tried to write a c program on the server. but I have no provilege to compile a c program on the server.

I can not find datediff or adddate, are them standard command? and I need to compare hours...

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