#!/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}}); }