Schrift
[thread]6821[/thread]

ip mit regexp aus einer Datei filtern: wie filtert man aus einer log datei ips



<< |< 1 2 3 4 >| >> 34 Einträge, 4 Seiten
misterx
 2005-03-28 16:35
#52995 #52995
User since
2005-03-28
23 Artikel
BenutzerIn
[default_avatar]
Hallo,

ich bin ein Neuling, was Perl angeht. Mein Problem ist:
ich habe eine log Datei, die enthält IP, timestamp in unix-Notation und verschiedene andere Angaben, die mich aber nicht interessieren.
Wie kann ich in Perl:
- die Datei einlesen
und
- daraus die IPs und timestamp filtern (mit regexp, nehme ich an)
- und dann anschliessend vergleichen, ob alle gefilterten ips nicht gleich sind (sollen ja alle verschieden sein, und falls doch mehrere gleich sind, soll mir das Skript z.B. sagen: 8 ips identisch.

Danke für die Hinweise!!
Grüsse
Ishka
 2005-03-28 17:18
#52996 #52996
User since
2003-08-04
771 Artikel
HausmeisterIn
[Homepage] [default_avatar]
Hier mal der Code, um die IPs zu filtern, wie du die timestamps rausfindest, lass ich dir als Übungsaufgabe (für Reguläre Ausdrücke ist perldoc perlre nicht schlecht):
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
my %hash=();
open(DATEI, "<$dateiname") or die "Error in reading $dateiname: $!\n";
while(<DATEI>){
if(m/((\d+)\.(\d+)\.(\d+)\.(\d+))/)
{
$hash{$1}++;
}else{
warn "Zeile $. in Dateiname enthält keine IP\n"; # In $. steht
# immer die Nummer der zuletzt gelesenen
# Zeile -- siehe perldoc perlvar
}
}
close DATEI;

for(keys %hash)
{
print "IP $_ tritt $hash{$_} mal auf.\n";
}


[edit] by Strat: Fehlerbehandlung hinzugefuegt....tststs[/edit]\n\n

<!--EDIT|Strat|1112166081-->
sub z{if(@_){1while$x[$k=rand 10];t($t=$x[$k]=1)}print map"$z[$x[$_]]$_".($_%3?
"":"\n"),1..9}sub t{$j=0;$x[$_+1]==$t&&($j+=2**$_)for 0..8;z,die"Gewinner $z[$t]
"if grep$_==($j&$_),7,56,73,84,146,273,292,448;z,die"Gleichstand\n"if@x>9&&!grep
!$_,@x}@x=4;@z=qw{. [ (};z$^T&1;while(<>){next if$_>9||$x[$_];t$t=$x[$_]=2;z 1}
misterx
 2005-03-28 19:25
#52997 #52997
User since
2005-03-28
23 Artikel
BenutzerIn
[default_avatar]
es erscheint bei mir aber eine Fehlermeldung:
main::log used only once: possible typo at line2. Danke aber für die Hinweise! Bin noch am probieren, ob es laufen wird.
Grüsse
--------
EDIT: Habe es jetzt hinbekommen, es lag an .txt - habe es vergessen, einzugeben.
Danke! Es FUNKTIONIERT.
Eine andere Frage vielleicht: kann man das Ergebnis, welches ausgegeben wurde, nochmal vergleichen mit einer anderen text-datei (log.txt), ob die Anzahl mit der Anzahl aus der zweiten text-datei übereinstimmt?
z.B. sieht die Ausgabe von der ersten Datei so aus:

127.54.45.9 1 mal gefunden
192.168.0.10 1 mal gefunden

Unten sollte die gesamte Anzahl erscheinen, in dem Fall: Insg. 2 ips gezählt.

Ich möchte dann diese Ausgabe mit einer anderen (2ten Textdatei vergleichen),so dass erscheint:

Insg. im file1 2 ips gefunden
insg. im file2 z.B. 10 ips gefunden.
Danke und Grüsse\n\n

<!--EDIT|misterx|1112024076-->
esskar
 2005-03-28 19:31
#52998 #52998
User since
2003-08-04
7321 Artikel
ModeratorIn

user image
poste mal deinen code!
misterx
 2005-03-28 20:06
#52999 #52999
User since
2005-03-28
23 Artikel
BenutzerIn
[default_avatar]
siehe Beitrag davor (Beschreibung)
sanfte Grüsse
Ishka
 2005-03-29 00:14
#53000 #53000
User since
2003-08-04
771 Artikel
HausmeisterIn
[Homepage] [default_avatar]
Ich seh deine Frage nicht so ganz. Wenn du das gleiche mit einer zweiten Datei machen willst, geht das, indem du entweder eine Schleife machst, oder den Code zweimal hintereinander schreibst. Nummerische Vergleiche gehen mit ==. Und wenn du wissen willst, wie du die Datei2 in den Hash kriegst, so wie die Datei 1 drinsteht, dann geht das so:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
open DATEI, "<$dateiname" or die "Error in reading $dateiname: $!\n";
while(<DATEI>){
if(m/((\d+)\.(\d+)\.(\d+)\.(\d+)) (\d)/)
{
$hash{$1}+=$2;
}else{
warn "Zeile $. in Dateiname schaut nicht so aus wie erwartet\n";
}
}
close DATEI;


[edit]Strat: Fehlerabfrage bei open hinzugefuegt...[/edit]\n\n

<!--EDIT|Strat|1112166170-->
sub z{if(@_){1while$x[$k=rand 10];t($t=$x[$k]=1)}print map"$z[$x[$_]]$_".($_%3?
"":"\n"),1..9}sub t{$j=0;$x[$_+1]==$t&&($j+=2**$_)for 0..8;z,die"Gewinner $z[$t]
"if grep$_==($j&$_),7,56,73,84,146,273,292,448;z,die"Gleichstand\n"if@x>9&&!grep
!$_,@x}@x=4;@z=qw{. [ (};z$^T&1;while(<>){next if$_>9||$x[$_];t$t=$x[$_]=2;z 1}
Gast Gast
 2005-03-29 10:40
#53001 #53001
Danke für die Antwort. Ich versuche es, etwas ausführlich zu forumlieren:

Wenn ich in der ersten Datei, die ich geöffnet habe, die IPs gefiltert habe (und z.B. die zugehörige ID: also sieht es z.B. so aus: 127.0.0.1 455; 127.0.0.2 456), möchte ich die zuerst sortieren aufsteigend nach der ID - in dem Fall 455 dann die zugehörige IP, dann 456 und die zugehörige IP, usw.

Dann möchte ich die Anzahl der IPs haben, d.h. wenn ich 70 ips samt id gefiltert habe, soll mir erscheinen: 70 ips insgesamt gezählt.

Dann soll eine 2te textdatei geöffnet werden, wo mir auch die IPs gefiltert werden und die Anzahl ausgegeben wird, z.B. 12 IPs gezählt.

Es sieht so aus: die erste Datei ist eine textdatei (log vom server von versendeten Nachrichten), die zweite ist auch eine Textdatei, aber vom Client mit empfangenen Nachrichten.
So kann ich mit dem Skript feststellen, dass z.B. wie oben beschrieben 70 ips gezählt wurden (also aus der serverlog), und dann 12 ips gezählt wurden (aus der clientlog). So weiss ich, dann 70 versendet wurden, aber nur 12 empfangen, d.h. 58 nachrichten sind verloren gegangen.

Sitze schon seit gestern drann, und es haut einfach nicht hin.
Danke für die Hinweise!
Grüsse
renee
 2005-03-29 11:54
#53002 #53002
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Anzahl IPs:print scalar(keys(%hash));

Sortierung:
Code: (dl )
1
2
3
for(map{$_->[0]}sort{$b->[1] <=> $a->[1]}map{[$_,$hash{$_}]}keys(%hash)){
print $_," ->",$hash{$_},"\n";
}
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
pq
 2005-03-29 12:32
#53003 #53003
User since
2003-08-04
12208 Artikel
Admin1
[Homepage]
user image
[quote=renee,29.03.2005, 09:54]Sortierung:
Code: (dl )
1
2
3
for(map{$_->[0]}sort{$b->[1] <=> $a->[1]}map{[$_,$hash{$_}]}keys(%hash)){
  print $_," ->",$hash{$_},"\n";
}
[/quote]
wieso nicht einfach
Code: (dl )
1
2
3
for(sort { $hash{$b} <=> $hash{$a} } keys(%hash)){
  print $_," ->",$hash{$_},"\n";
}

deine ST war hier unnötig, du wandelst ja nur einen hash in ein array um.
die ST braucht man i.d.R. nur bei aufwendigeren operationen, z.B.
regulären ausdrücken.
Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live. -- Damian Conway in "Perl Best Practices"
lesen: Wiki:Wie frage ich & perlintro Wiki:brian's Leitfaden für jedes Perl-Problem
renee
 2005-03-29 12:48
#53004 #53004
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
manchmal sieht man den Wald vor lauter Bäumen nicht...
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
<< |< 1 2 3 4 >| >> 34 Einträge, 4 Seiten



View all threads created 2005-03-28 16:35.