use strict; use warnings; my @cmdoutput = ( ' Interface IHQ IQD OHQ OQD RXBS RXPS TXBS TXPS TRTL', '-----------------------------------------------------------------------------------------------------------------', '* GigabitEthernet0/0/0 1 0 0 0 115000 111 143000 81 0', '* Gi0/0/0.15 - - - - - - - - -', '* Gi0/0/0.999 - - - - - - - - -', '* GigabitEthernet0/0/1 0 0 0 0 91000 32 0 0 0', '* GigabitEthernet0/0/3 0 0 0 0 162000 168 2206000 212 0', '* GigabitEthernet0/1/1 0 0 0 0 4850000 1005 9590000 1153 0', '* GigabitEthernet0/1/4 0 0 0 0 2105000 200 136000 155 0', '* Te0/3/0 0 0 0 0 10134000 1480 4448000 843 0', ); my %interface_bytes; foreach my $summary (@cmdoutput) { chomp($summary); $summary =~ s/\s+/ /g; my $Star = 0; my $Intf = 0; my $IHQ = 0; my $IQD = 0; my $OHQ = 0; my $OQD = 0; my $RXBS = 0; my $RXPS = 0; my $TXBS = 0; my $TXPS = 0; my $TRTL = 0; my $Track = ""; my $rec = "Sasquatch"; # remove extra spaces my $fields = () = $summary =~ /[\s+,:]/g; # Debug if records are not processing correctly # print "Record contains $fields fields\n"; if ( $fields == 0 ) { print "No fields\n"; next; } elsif ( $fields == 10 ) { ( $Star, $Intf, $IHQ, $IQD, $OHQ, $OQD, $RXBS, $RXPS, $TXBS, $TXPS, $TRTL ) = split( ' ', $summary ); if ( $Star ne "*" ) { next; } elsif ( $RXBS =~ /\D/ ) { next; } elsif ( $TXBS =~ /\D/ ) { next; } else { $Track = join "<<-", $rec, $Intf; $interface_bytes{$Track} += $RXBS; $Track = join "->>", $rec, $Intf; $interface_bytes{$Track} += $TXBS; } } else { print STDERR "Danger Will Robinson - my sensors detect an invisible hole that may consume you\n"; } } my $key = ""; my @keys = (); my $lastid = 4; # sort by value and put the keys in an array (Ascending sort) @keys = sort { $interface_bytes{$a} <=> $interface_bytes{$b} } keys %interface_bytes; # foreach $key ( @keys[ 0 .. $lastid ] ) { foreach $key (@keys) { if ( not defined $key ) { next; } # printf("%-45s %-6d\n","\t".$key,$interface_bytes{$key}); # my $number = $interface_bytes{$key}; # $number =~ s/(\d)(?=(\d{3})+(\D|$))/$1\,/g; # printf("%-20s %-8s\n",$key,$number); printf( "%-10s %-6s\n", "\t" . $key, $interface_bytes{$key} ); }