Logfile Auswertung

Hallo,

ich versuche gerade eine Logdatei zu zerlegen, aber nachfolgende Zeile tut es nicht.

if($lines =~/’:137 (’/)

Auszug der Logdatei: (ohne Zeilenumbruch)

2002.10.11-20:04:59 local, Sun Nov 10 20:03:25 2002 INET: refuse from if 10001 prot 17 65.128.140.212:1025->192.168.3.3:137 (RI 9 FI 19)

Wenn ich z.B. if($lines =~/refuse from if 10001/)
eintrage, dann geht es.

Wenn es keine Mühe kostet, könnt ihr mir vielleicht verraten, wie ich die 65.128.140.212 (kann jedes mal eine andere sein) rausfiltern kann.

Hier mal mein gesamtes Script: (noch keine Endlösung)

#!/usr/bin/perl -w

open(OLDFIRE, „>> D:/old.syslog.txt“);
open(SMB, „>> d:/oldsmb.txt“);
open(FIRE, „d:/syslog.txt“);
while($lines = )
{
if($lines =~/refuse from/)
{
if($lines =~/’:137 (’/)
{
print SMB „$lines“;
}
else
{
print OLDFIRE „$lines“;
}
print „$lines“;
}
}
close(FIRE);
close(SMB);
close(OLDFIRE);
*********************************************

Natürlich bin ich für andere Verbesserungen dankbar.

Ralf

Hi Ralf,

so wie das Script hier erscheint liegt es wahrscheinlich an dne Klammern (du willst doch wahrscheinlich keine Gruppierung und den gematchten Teilstring nach $1, sondern das Zeich ‚(‘ matchen). In diesem Fall solltest du das Zeichen quoten (-> ‚(‘).

Ich vermute mal, daß du alle Quell-IPs ausgeben willsts (von abgewiesenen IP-Verbindungen auf die bösen (M$) SMB-Ports). Dann würde ich das sinngemäß so machen:

while ()
{
 if (m/refuse from/) # abgewiesen?
 {
 next unless m/:137/; # nur SMB (hier ggf andere)
 
 $\_ =~/(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}):\d+-\>/;
 # Source IP ermitteln und nach $1
 print "Source: $1\n";
 }
}

Weitere Verbesserungen (welche Info wird wohin geschrieben etc. pp.) als Übung.

Gruß
bernhard

Hi Bernhard,

Dein Sript funzt Super. Vielen Dank.
Könntest du mir noch ein Tipp geben wie die IP-Adressen sortieren könnte? Welche Perl-Funtkion sollte ich mir mal näher betrachten, wobei ich dopplete IP auschliessen kann?

Gruß Ralf

Hi Ralf,
doppelte Einträge ausschließen geht eigentlich am einfachsten mit Hilfe von Hashes, weil es zu einem Key immer nur einen Eintrag geben kann.

In etwa so:

... Schleife drumrum, die IPs in Variable $ip liefert ...

$found\_ips{$ip}++; # DAS WAR ALLES. Du hast jetzt die 
 # Informationen,
 # 1. daß eine IP vorgekommen ist
 # (sofern der Key existiert)
 # 2. wie oft sie vorgekommen ist (der
 # Eintrag (value) dient gleichzeitig
 # als Zaehler


... zur Ausgabe würde ich es mal mit 'sort' versuchen ...

foreach $ip (sort keys %found\_ips)
{
 print "$ip\n";
}

(sort kann noch viel mehr - z.B. kannst du mit eigenen sort-Blöcken arbeiten, was in dem Fall ganz praktisch waere. --> perldoc -f sort)

Gruß
bernhard

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Danke.

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]