Здесь решение с использованием 'Perl'. Я немного изменил ваш входной файл. Проверьте это:
Данные входного файла:
$ cat ayda.txt
213.46.27.204 - - [15/Sep/2011:22:55:21 +0100]
213.46.27.204 - - [16/Sep/2011:22:55:21 +0100]
213.46.27.204 - - [17/Sep/2011:22:55:21 +0100]
213.46.27.204 - - [18/Sep/2011:22:55:21 +0100]
213.46.27.204 - - [19/Sep/2011:22:55:21 +0100]
Perl-скрипт:
$ cat script.pl
use warnings;
use strict;
use Time::Local;
my %MONTH = (
Jan => 0,
Feb => 1,
Mar => 2,
Apr => 3,
May => 4,
Jun => 5,
Jul => 6,
Aug => 7,
Sep => 8,
Oct => 9,
Nov => 10,
Dec => 11
);
my $SECONDS_IN_HOUR = 60 * 60;
my $SECONDS_IN_DAY = $SECONDS_IN_HOUR * 24;
## Extract and check arguments.
@ARGV == 3 or die qq[Usage: perl $0 logfile [-d|-h] num\n];
my ($time, $option) = ( pop @ARGV, pop @ARGV );
die qq[ERROR: Invalid input arguments\n] if $time =~ /\D/;
## Get the utc time to filter data file.
my $current_utc = time;
my $param_utc;
if ( $option eq "-h" ) {
$param_utc = $current_utc - $time * $SECONDS_IN_HOUR;
}
elsif ( $option eq "-d" ) {
$param_utc = $current_utc - $time * $SECONDS_IN_DAY;
}
else {
die qq[ERROR: Invalid input\n];
}
## When true, print data until eof.
my $in_time = 0;
while ( <> ) {
if ( $in_time .. eof ) {
print;
next;
}
chomp;
m|\[(\d{2})/(\w{3})/(\d{4}):(\d{2}):(\d{2}):(\d{2})| || next;
my $utc = timelocal( $6, $5, $4, $1, $MONTH{ $2 }, $3 - 1900 );
if ( $param_utc - $utc <= 0 ) {
$in_time = 1;
print $_, qq[\n];
}
}
Запуск скрипта:
$ perl script.pl
Usage: perl script.pl logfile [-d|-h] num
$ perl script.pl ayda.txt -d 4
213.46.27.204 - - [16/Sep/2011:22:55:21 +0100]
213.46.27.204 - - [17/Sep/2011:22:55:21 +0100]
213.46.27.204 - - [18/Sep/2011:22:55:21 +0100]
213.46.27.204 - - [19/Sep/2011:22:55:21 +0100]
$ perl script.pl ayda.txt -h 30
213.46.27.204 - - [18/Sep/2011:22:55:21 +0100]
213.46.27.204 - - [19/Sep/2011:22:55:21 +0100]