[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        10          9          8

i have done it with grep & awk with success but i would like to script it from scratch. Thanks"
Who is Participating?
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];


Open in new window

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 5 2 2 1 1
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        5      2
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"
stressmessAuthor Commented:
as a newbie in perl I was eager to know how to write the script. Cheers Jeromee"
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.