All pastes #104391 Raw Edit

Log stats

public text v1 · immutable
#104391 ·published 2006-07-28 21:14 UTC
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}});
}