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";