LOG script

Sziasztok!

A következőbe kérném segítségeteket: Lenne egy elég nagy log fileom (~350 MB átlagba a mérete), jellemzően ip címek vannak benne. Azt szeretném vele csinálni, hogy kiválogatni csak az ip címeket, megszámolni melyik cím hányszor fordul elő, s a 10 legtöbb sorral rendelkező ip címet sorrendbe (a legtöbb sorral rendelkező ip címet az első helyre s így tovább) egy fileba írni.

Tudtok ti erre valami kész megoldást, vagy mindenképp valami scriptet kell rá majd faragnom. Ha igen odáig elméletbe eljutottam, hogy mondjuk regexpes awk-val kiszedem az ip címeket, de ez után rögtök el is akadtam, hogy hogy fogom megszámolni melyik címből mennyi van, ezután meg gondolom sort-al sorrendbe lehetne állítani.

Segítségeteket előre is köszönöm!

Hozzászólások

sed -n 's%.* src=\(192.168.[0-9.]*\).*%\1%p' /proc/net/ip_conntrack | sort |awk '{ip[$1] = ++ip[$1]}; END{for (e in ip) {print e, " : ", ip[e] }}'

Igaz ez tomatora szántam és a belső kapcsolatokat számolja meg, de kiindulási alapnak jó lesz

grep -oE "[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+" LOG | sort | uniq -c | sort -r | head

nyilván a regexpet a feladathoz lehet (nem hiszem hogy kellene) igazítani de az awk egy kicsit erősnek tűnt :) mármint úgy hogy ez első sortot ami igen erőforrásigényes nem váltod ki vele

Remek alkalom, hogy megtanulj programozni :-). Beteszed egy map-be az IP-ket, és hozzájuk rendelsz egy számlálót, amit növelsz minden előforduláskor. Ha felépült, akkor kiveszed az IP cím-előfordulás párokat, előfordulás szerint rendezed őket, majd kiírod a kimenetre.

Ha nem tudnék programozni, akkor betenném az IP címeket egy adatbázis táblába (erre tuti van 1000 találat, hogy hogyan kell), majd egy ilyesmi kéréssel lekérném a számosságok szerint rendezve:

http://blog.sqlauthority.com/2007/07/11/sql-server-count-duplicate-reco…

Köszönöm a hozzászólásokat! Kipróbálom majd a tippeket! :)

Én is festek egyet ezen a biciklitárolón:

perl -ne'/(\d+\.\d+\.\d+\.\d+)/;$h{$1}++}{print "$_\t$h{$_}\n" for (sort {$h{$b} <=> $h{$a}} keys %h)[0..9]' path/to/logfile > eredmeny

#!perl

use 5.010;
use strict;
use warnings;
use Regexp::Common qw/ net /;

my %addr;
while ( my $line = <ARGV> ) {
  $addr{$_}++ for ( $line =~ /$RE{net}{IPv4}/g );
}

say join $/, grep defined,
  ( reverse sort { $addr{$a} <=> $addr{$b} } keys %addr )[ 0 .. 9 ];

reverse kell!