Thread ip mit regexp aus einer Datei filtern: wie filtert man aus einer log datei ips (33 answers)
Opened by misterx at 2005-03-28 16:35

misterx
 2005-04-10 16:33
#53027 #53027
User since
2005-03-28
23 Artikel
BenutzerIn
[default_avatar]
so, hier ist mein Quellcode - die anzahl der ips in ip2.txt wird aber nicht gezählt, weiss leider nicht; wieso.
Hier mein Quellcode:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
#! /usr/bin/perl

use warnings;
use strict;
use Getopt::Long;

my ($filterPassword, $filterIp, $file, $file2, $counter_file1, $counter_file2);
my $help = 0;

GetOptions(
 "password=s"     => \$filterPassword,
 "ip=s"           => \$filterIp,
 "file=s"         => \$file,
 "file2=s"        => \$file2,
 "h"              => \$help,
);

if ($help) {
# &PrintHelp....
 exit 1;
} # if


unless (open (LOG, "<", $file)) {
 die "Error: couldn't open '$file': $!\n";
} # unless

my %filteredLines;
my $counter_file1 = 0;
while (<LOG>) {
$counter_file1++;
 chomp($_);
 my (undef, $pass, $ip) = split(/ /, $_);
 #if ($pass eq $filterPassword and $ip eq $filterIp) {
   if (($pass eq $filterPassword )
      or ($ip eq $filterIp) or ($pass eq $filterPassword and $ip eq $filterIp)) {
       push(@{$filteredLines{$ip}},$_);
 } # if
} # while
close (LOG);

{
 local $/ = "\n===";
 open(FILE2,"<$file2") or die $!;
 my $counter_file2 = 0;
while(<FILE2>){
$counter_file2++;
  next unless($_ =~ m/ip/s);
 
   next unless($_ =~ m/ip/s);
   my ($ip)   = $_ =~ m/ip\s*?:\s+([^\s]+)/s;
   my ($pass) = $_ =~ m/password\s*?:\s+([^\s]+)/s;
 #  if ($pass eq $filterPassword and $ip eq $filterIp) {
  if (($pass eq $filterPassword ) or ($ip eq $filterIp) or ($pass eq $filterPassword and $ip eq $filterIp)) {{
     if($filteredLines{$ip}){
       print $_,"\n" for(@{$filteredLines{$ip}});
     }
   } # if
 }
}
}

close FILE2;
print qq~
IPs in $file: $counter_file1
IPs in $file2: $counter_file2
~;


hier die ip1.txt:
Code: (dl )
1
2
 1113193722 password1 127.0.0.1 1113193718 55555
1113193722 password2 127.0.0.2 1113193718 66666

und die ip2.txt
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
 ====================================
time:  20050101101221
ip :  127.0.0.1
password:  password1

<html> hier der Text
</html>
===========================
time: 20050101101221
ip:   192.168.0.33
password: test

<body>
irgasdklgj
asvlkasjdv
slakdfj
============================
time: 2394870985235
ip: 127.0.0.2
password: password2

asvklhaskdjvhasdv
sdvasdvasdvsdv


wenn ich nun eingebe:
perl skript.pl -ip 127.0.0.1 -file ip1.txt -file2 ip2.txt; dann werden die ips (in diesem Fall die 127.0.0.1) aus ip2.txt nicht gezählt. Wieso? Danke für die Hinweise!

Eine andere Frage: in ip1.txt steht immer in der vierten Spalte der unixtimestamp (bsp:
Code: (dl )
1113193718
).
in ip2.txt steht in jedem Datensatz, welcher durch === getrennt ist, auch die zeit, aber im human-format: beispiel:
ip1.txt: 1112263698 == ip2.txt "Mo Apr 20 12:50:33 2005".

Wie kann ich es überprüfen, ob die Zeit aus ip1.txt gleich der aus ip2.txt ist?
ich weiss, es gibt in CPAN die ParseDate funktion; aber die Daten liegen ja in dem oben genannten Format, deswegen brauche ich eine eigene.

Wieso ich es brauche? Eine IP kann ja mit gleichem password mehrere logeinträge gemacht haben, und die kann ich nur auseinanderhalten an dem Zeitstempel.
Wenn ich also eingebe:
perl skript.pl -ip 127.0.0.1 -file ip1.txt -file2 ip2.txt, dann
soll gefiltert werden nach der ip in beiden Dateien, die Anzahl der gefundenen Einträge in beiden .txt ausgegeben werden, und wenn man z.B. noch die option -time   einbaut, dann ist es eindeutig; also sowas:

perl skript.pl -ip 127.0.0.1 -time 1112263698 -file ip1.txt -file2 ip2.txt,
d.h. es wird die ip 127.0.0.1 aus ip1.txt genommen mit dem genannten Zeitstempel und wird vergliechen mit der 127.0.0.1 aus ip2.txt; aber vor allem anhand des stempels (der ja z.b.
Mo Apr 20 12:50:33 2005 ist) - dann wird ausgegeben:
z.b. bei mehreren gleichen ips, aber unterschiedlichen zeitstempel:

in ip1.txt found insg. 4 ips, in ip2.txt found insg. 4 ips,
but with same timestampe: found 1 in ip1.txt, 1 ip in ip2.txt.

Danke für die Hinweise! Sitze schon seit fast einer Woche drann, und habe immer nur Teillösungen, die teilweise funktionieren. Grüsse
----
PS: Edit: da ich weiss, dass die .txt immer die gleichen ips und passwörter enthalten, möchte ich es optional machen, d.h. dass man nur

perl skript.pl  -time 1112263698 -file ip1.txt -file2 ip2.txt,
eingibt, und trotzdem die Ausgabe erscheint. Und OPTIONAL soll es mit -ip und - password ebenso funktionieren (tut es ja jetzt auch), wenn sich doch die ip vom ISP ändert.
DANKE!

EDIT: Eine Frage noch: was macht im quellcode:

Code: (dl )
my ($pass) = $_ =~ m/password\s*?:\s+([^\s]+)/s;


filtert es den zugehörigen password? Also match password?
Das Passwort ist ja aber verschieden, in ip1.txt steht es immer in der 2ten Spalte; es kann also heissen perluser oder 2bon2b; oder etwas anderes. Es ist halt immer die zweite Spalte, wo das Passwort steht; in der dritten steht immer die IP.
Danke für Hinweise!
Ich dachte halt, dass die ganze Datei ip1.txt in array eingelesen wird -Zeilenweise, also:

1113193722 user 127.0.0.1 1113193718 55555
1113193722 keins 127.0.0.2 1113193718 66666
usw....

und in array[1] steht immer das password; in dem Fall user und keins und noch weitere, falls die Datei länger wird, in
array[2] steht immer die IP, und in array[3] immer der Zeitstempel, in array[4] die zugehörige porcessid.

Und dann halt vergliechen wird anhand des arrays.\n\n

<!--EDIT|misterx|1113140163-->

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