my(%ips,%files_bytes,$files_requests,%date_bytes,$date_requests);
my %months = (
  'Jan' => '01',
  'Feb' => '02',
  'Mar' => '03',
  'Apr' => '04',
  'May' => '05',
  'Jun' => '06',
  'Jul' => '07',
  'Aug' => '08',
  'Sep' => '09',
  'Oct' => '10',
  'Nov' => '11',
  'Dec' => '12',
);
while(<>) {
  chomp;
  # 216.164.242.71 - - [29/Jun/1999:12:45:11 -0400] "GET / HTTP/1.1" 200 61
  # if( /^((?:\d+\.){4})\s+\-\s+\-\s+\[([^\]]+)\]\s+"([^"]+)".*$/ ) {
  if( /^((?:\d{1,3}\.){3}\d{1,3})\s+\-\s+\-\s+\[([^\]]+)\]\s+"([^"]+)"\s+(\d+)\s+(\d+)$/ ) {
    my($ip,$time,$req,$code,$bytes) = ($1,$2,$3,$4,$5);
    next if $code == 404;
    #print "ip: $ip  time: $time  request: $req\n";
    $ips{$ip}++;

    # daily transmission stats...
    $time =~ /^(\d+)\/(\w{3})\/(\d+)/;
    my($day,$mon,$year) = ($1,$2,$3);
    $mon = $months{$mon};
    $date_requests{"$year:$mon:$day"}++;
    $date_bytes{"$year:$mon:$day"} += $bytes;

    my($file);
    if( $req =~ /^(\S+)\s+(\S+)\s*/ ) {
      $file = $2;
      if($file=~/\/$/) { $file .= "index.html" };
      # print "getting file name from: \"$req\"   = $file\n";
      $files_requests{$file}++;
      $files_bytes{$file} += $bytes;
    }
    else {
      warn "Error finding file name from: $req\n";
    }
  }
}

print "There were: ", scalar(keys(%ips)), " unique visitors\n";
print "\n";

print "Daily Stats\n";
printf("  %s                % 5s        %s\n",
    "Day", "Requests", "Bytes");
my($tot_req, $tot_bytes) = (0,0);
foreach my $day (sort(keys(%date_requests))) {
  $tot_req   += $date_requests{$day};
  $tot_bytes += $date_bytes{$day};
  printf("  %s          % 5s          % -12s\n", 
    $day,
    &comma_format($date_requests{$day}),
    &comma_format($date_bytes{$day}));
}
printf("  % 4s          % 5s          % -12s\n", 
 ' ', &comma_format($tot_req), &comma_format($tot_bytes) );

print"\n";
print"File Stats:\n";
print "  Requests   Bytes      File\n";
foreach my $file (keys(%files_requests)) {
  printf("  %10s  % 10s    %s\n", 
    &comma_format($files_requests{$file}), 
    &comma_format($files_bytes{$file}), 
    $file );
  $files_by_count{sprintf("%010d",$files_requests{$file}) . ":" . $file} = $file;
  $files_by_bytes{sprintf("%010d",$files_bytes{$file}) . ":" . $file} = $file;
}

print"\n";
print "Sorted by Requests:\n";
foreach my $key (reverse(sort(keys(%files_by_count)))) {
  my $count = $key;
  # warn "key is: $key\n";
  $count =~ s/:.*$//;
  $count += 0;
  printf("  %10s      %s\n", 
    &comma_format($count), 
    $files_by_count{$key});
}

print"\n";
print "Sorted by Bytes:\n";
foreach my $key (reverse(sort(keys(%files_by_bytes)))) {
  my $bytes = $key;
  $bytes =~ s/:.*$//;
  $bytes += 0;
  printf("  %10s      %s\n", 
    &comma_format($bytes), 
    $files_by_bytes{$key});
}


sub comma_format
{
  my $data = shift;
  while($data=~s/(\d+)(\d\d\d)/$1,$2/) { 1; }
  return $data;
}


print "\n\n";
