#!/usr/bin/perl use warnings; use strict; use Data::Dumper; our %counts; # Input lines look like this: # May 23 19:00:02 chiark innduct[23236]: news.relativity.greenend.org.uk| info: completed feedfile read=76 (+bl=7,+err=0) missing=0 offered=76 (ch=76,nc=0) accepted=75 (ch=75,nc=0) unwanted=1 (id=1,bod=0,nc=0) rejected=0 (id=0,bod=0,nc=0) deferred=0 (id=0,bod=0,nc=0) missing=0 (id=0,bod=0,nc=0) connretry=0 (id=0,bod=0,nc=0) if (@ARGV && $ARGV[0] =~ m/^\-/) { die "$0: bad usage: no options supported\n"; } while (<>) { next unless m/^ [:0-9A-Za-z ]+[ ] \w+[ ] innduct\[\d+\]:[ ] ([^|<>: \t]+)\|[ ] (?: info | notice ):[ ] (?: completed | processed )[ ] .*? ( (?: [ ] (?: \w+ = \d+ | \( [=+,0-9a-z]+ \) ) )+ ) $/x; my ($site,$strs) = ($1,$2); die unless $strs =~ m/^ read=/; my $cur; $strs .= ' '; my $c= \%{ $counts{$site} }; #print Dumper($c); for (;;) { if ($strs =~ s/^[ ] (\w+) = (\d+) [ ]/ /x) { $cur= $1; $c->{$cur} += $2; } elsif ($strs =~ s/^ [ ] \( ( \+? \w+ ) = (\d+) (?: , ([^()]+) )? \) [ ]/ sprintf " (%s) ", defined $3 ? $3 : '' /xe) { $c->{"${cur}_$1"} += $2; } elsif ($strs =~ s/^ \(\) / /) { } elsif ($strs eq ' ') { last; } else { die "$_ // $strs ?"; } } # print "$site|"; # foreach my $k (sort keys %$c) { printf " %s=%d", $k, $c->{$k}; } # print "\n"; } #print STDERR Dumper(\%counts);; our $cwr; our $site; our $processed; foreach $site (sort keys %counts) { $cwr= $counts{$site}; $processed= $cwr->{offered} - $cwr->{deferred}; write; } sub pct ($$) { my ($dend,$dor) = @_; return undef unless defined($dend) and $dor; return $dend * 100.0 / $dor; } sub amt ($) { my ($v) = @_; return '' unless defined $v; if ($v < 9999) { return sprintf "%4d ", $v; } if ($v < 9999e3) { return sprintf "%4dk", ($v / 1e3); } return sprintf "%4dm", ($v / 1e3); } format STDOUT_TOP = offrd defer acctd unwtd rejtd df% ac% rj% nochk nc% . format STDOUT = @>>>> @>>>> @>>>> @>>>> @>>>> ^## ^## ^## @>>>> ^## @<<<<<<<<<<<<<<<<<<<<<<<... { (map { amt($cwr->{$_}) } qw(offered deferred accepted unwanted rejected)), (pct($cwr->{deferred}, $cwr->{offered})), (map { pct($cwr->{$_}, $processed) } qw(accepted rejected)), ($cwr->{offered_nc} ? (amt($cwr->{offered_nc}), pct($cwr->{offered_nc}, $processed)) : ('',undef)), ($site) } .