rendered paste body#!/usr/bin/env perl
use strict;
use Time::Local;
use POSIX qw/strftime/;
sub mktime {
my ($day, $month_name, $year) = @_;
my %months = (
Jan => 0,
Feb => 1,
Mar => 2,
Apr => 3,
May => 4,
Jun => 5,
Jul => 6,
Aug => 7,
Sep => 8,
Oct => 9,
Nov => 10,
Dec => 11
);
return timelocal(0, 0, 0, $day, $months{$month_name}, $year);
}
my %counts;
my $previous = "";
my $date;
my $ip;
my $str_date;
while (<>) {
# m#(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})\s-\s-\s\[(\d{2}/\w{3}/\d{4})#;
# $ip = $1;
# unless ($previous eq $2) {
# $previous = $2;
# $date = &mktime(split(/\//, $previous));
# }
# I gain some speed by using string functions
$ip = substr($_, 0, index($_, " "));
$str_date = substr($_, index($_, "[") + 1, 11);
unless ($previous eq $str_date) {
$previous = $str_date;
$date = &mktime(split(/\//, $previous));
}
if (exists($counts{$date})) {
unless (grep { $ip eq $_ } @{$counts{$date}}) {
push(@{$counts{$date}}, $ip);
}
} else {
$counts{$date} = [];
}
}
foreach my $key (sort keys %counts) {
my (undef, undef, undef, $day, $month, $year, undef, undef, undef) = localtime($key);
printf "%s\t%d\n", strftime("%d-%b-%Y", 0, 0, 0, $day, $month, $year),
scalar(@{$counts{$key}});
}