[PERL] Sorting and Counting IP Addresses in a log file

I have a log file attached which I need to sort & count the top 5 Ip address, example :

IP                     Count
192.168.0.36        10
192.168.0.14          9
192.168.0.28          8
...
...

i have done it with grep & awk with success but i would like to script it from scratch. Thanks"
test.log.docx
stressmessAsked:
Who is Participating?
 
jeromeeCommented:
Here you go...
use strict;

my $ipfile = "/tmp/ips.txt";

open(IPS, $ipfile) || die "Can't open the file $ipfile: $!\n";
my %countPerIp;
while( <IPS> ) {
   $countPerIp{$1}++  if /from ([0-9.]+)/;
}

my @results = map{sprintf("%-15s %5d\n", $_, $countPerIp{$_})} sort{$countPerIp{$b}<=>$countPerIp{$a}} keys %countPerIp;

printf("%-15s %5s\n", qw(IP COUNT));
print @results[0..4];

close(IPS);

Open in new window

0
 
jeromeeCommented:
If you don't mind a one-liner:
assuming that the file (/tmp/ee2) contains a list (one per line) of IPs:

 perl -ane'$c{$F[0]}++; END{print "IP\tCOUNT\n"; @r=map{"$_\t$c{$_}\n"} sort{$c{$b}<=>$c{$a}} keys %c; print @r[0..4]}' /tmp/ee2
IP      COUNT
1.2.3.4 5
4.5.6.7 2
5.6.7.8 2
2.3.4.5 1
8.9.0.0 1
0
 
jeromeeCommented:
Oops, I just realized that you included a file.
Here's a slightly modified version:

perl -ne'($ip)=/from ([0-9.]+)/; $c{$ip}++ if $ip; END{printf("%-15s %5s\n",qw(IP COUNT)); @r=map{sprintf("%-15s %5d\n", $_, $c{$_})} sort{$c{$b}<=>$c{$a}} keys %c; print @r[0..4]}' your_file.txt
IP              COUNT
74.208.47.57        5
218.234.23.147      2
0
 
stressmessAuthor Commented:
hi jeromee your method is good but I'm after the script instead because I want to put it into one of my command line options. Thanks"
0
 
stressmessAuthor Commented:
as a newbie in perl I was eager to know how to write the script. Cheers Jeromee"
0
Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.

All Courses

From novice to tech pro — start learning today.