#!/usr/local/bin/perl use DB_File; use Fcntl; $db_file = "weekly.db"; $high_id = 0; tie (%STATS, DB_File, $db_file, O_RDWR|O_CREAT, 0644, $DB_HASH); while (($id, $value) = each %STATS) { $id > $high_id && ($high_id = $id); ($document, $bytes) = split(/\*/, $value); $doc_hits{$document}++; $doc_bytes{$document}+=$bytes; $hits++; } $id = $high_id+1; while(<>) { next if /^$/; $hits++; /^([A-Za-z0-9\._-]+)[^"]*"([^"]+)" ([0-9]+) ([0-9]+|\-)/ && ( $hostname=$1, $command=$2, $resp=$3, $bytes=$4 ); ($type, $document, $version) = split (/ /,$command); next if $bytes =~ /^\-$/; next if $resp ne "200"; $doc_hits{$document}++; $doc_bytes{$document}+=$bytes; $bytes > $doc_size{$document} && ($doc_size{$document}=$bytes); $total_bytes+=$bytes; $STATS{$id} = join($document, $bytes); $id++; } untie %STATS; print <<EOT; <HTML><HEAD><TITLE>Web Statistics</TITLE></HEAD><BODY> <H1>Web Statistics</H1> <TABLE BORDER=0> <TR><TD WIDTH=200>Total Hits</TD><TD>$hits</TD></TR> <TR><TD WIDTH=200>Total Bytes</TD><TD>$total_bytes</TD></TR> </TABLE><P> Document Information (sorted by hits and document filename):<BR> <TABLE BORDER=1 WIDTH=100%> <TR> <TD WIDTH=40%>Document</TD> <TD WIDTH=15%>Hits</TD> <TD WIDTH=15%>Bytes</TD> <TD WIDTH=15%>% Hits</TD> <TD WIDTH=15%>% Bytes</TD> </TR> EOT sub sort_doc_hits { ($doc_hits{$b} <=> $doc_hits{$a}) || ($a cmp $b); } for (sort sort_doc_hits keys %doc_hits) { $hit_percent = sprintf "%-8.2f", ($doc_hits{$_} / $hits) * 100.0; $byte_percent = sprintf "%-8.2f", ($doc_bytes{$_} / $total_bytes) * 100.0; $document = pack("A30",$_); print <<EOT; <TR> <TD><A HREF="$_">$document</A></TD> <TD ALIGN=RIGHT>$doc_hits{$_}</TD> <TD ALIGN=RIGHT>$doc_size{$_}</TD> <TD ALIGN=RIGHT>$hit_percent</TD> <TD ALIGN=RIGHT>$byte_percent</TD> </TR> EOT } print "</TABLE></BODY></HTML>\n";