On Mon, 2004-08-09 at 22:21, Stephen Gran wrote: > Don't loop - make a more complicated data structure, like a multi level > hash (ugly pseudo-code to follow):
Ok. > Just read the file once, fill in the bits as you go, and process the > whole thing at the end. I wrote this and it's much much faster. In fact the old way of looping through the file multiple times took a 1 minute and 20 seconds while the code below took 20 seconds. #!/usr/bin/perl -w print "Shows uniques hosts with a virus count over 10:\n"; open(FILE, "/var/log/maillog"); while(<FILE>) { if (/(\d|\D)+sendmail\[(\d)+\]:\s((\w)+):(\d|\D)+\[(\d+\.\d+\.\d+\.\d+)\]/) { $ip_addr = $6; $message_id = $3; unless ( $ip_addr eq "127.0.0.1" ) { $email->{$message_id}->{ip_addr} = $ip_addr; } } elsif (/(\d|\D)+clamav-milter\[(\d)+\]:\s((\w)+):\sstream:\s(\d|\D+)virus(\d|\D)+/) { $message_id = $3; $virus = $5; $email->{$message_id}->{virus} = $virus; } } close(FILE); foreach $message_id ( keys %{ $email } ) { if ( $email->{$message_id}->{virus} ) { $virus = $email->{$message_id}->{virus}; $ip_addr = $email->{$message_id}->{ip_addr}; $ip_addr{$virus}++; $virus{$ip_addr}++; } } sub hashValueDescendingNum { $ip_addr{$b} <=> $ip_addr{$a}; } foreach $virus (sort hashValueDescendingNum (keys(%ip_addr))) { print "Count is $ip_addr{$virus} for $virus\n"; } sub hashValueDescendingIp { $virus{$b} <=> $virus{$a}; } foreach $ip_addr (sort hashValueDescendingIp (keys(%virus))) { if ($virus{"$ip_addr"} >= "10") { print "Count is $virus{$ip_addr} for $ip_addr\n"; } } ------------------------------------------------------- SF.Net email is sponsored by Shop4tech.com-Lowest price on Blank Media 100pk Sonic DVD-R 4x for only $29 -100pk Sonic DVD+R for only $33 Save 50% off Retail on Ink & Toner - Free Shipping and Free Gift. http://www.shop4tech.com/z/Inkjet_Cartridges/9_108_r285 _______________________________________________ Clamav-users mailing list [EMAIL PROTECTED] https://lists.sourceforge.net/lists/listinfo/clamav-users