Schrift
Wiki:Tipp zum Debugging: use Data::Dumper; local $Data::Dumper::Useqq = 1; print Dumper \@var;
[thread]6821[/thread]

ip mit regexp aus einer Datei filtern: wie filtert man aus einer log datei ips (Seite 3)



<< |< 1 2 3 4 >| >> 34 Einträge, 4 Seiten
renee
 2005-03-31 10:44
#53015 #53015
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Aber ip1.txt ist wirklich so aufgebaut??
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/
misterx
 2005-03-31 11:55
#53016 #53016
User since
2005-03-28
23 Artikel
BenutzerIn
[default_avatar]
[quote=renee,31.03.2005, 08:44]Aber ip1.txt ist wirklich so aufgebaut??[/quote]
ip1.txt hat folgenden Aufbau:

Code: (dl )
1
2
1113193722 password1 127.0.0.1 1113193718 55555
1113193722 password2 127.0.0.2 1113193718 66666

usw. mit mehreren Einträgen.

ip2.txt hat den Aufbau:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
====================================
time:  20050101101221
ip :  127.0.0.1
password:  password1

<html> hier der Text
</html>
===========================

dann der 2te Eintrag, wie oben, halt mit anderen Daten.
usw.


Wie kann ich da die ip und password rausfiltern? Über ein array, oder?
Danke für die Hilfe!
Grüsse\n\n

<!--EDIT|misterx|1112255738-->
renee
 2005-03-31 12:37
#53017 #53017
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
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
#! /usr/bin/perl
use warnings;
use strict;
use Getopt::Long;

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

# z.B. program.pl -p password -i 127.0.0.1 -file datei.txt
# oder: program.pl -h
GetOptions(
"password=s" => \$filterPassword,
"ip=s" => \$filterIp,
"file=s" => \$file,
"file2=s" => \$file2,
"h" => \$help,
);

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

# vielleicht hier noch ueberpruefen, ob $filterPassword und $filterIp gesetzt sind....

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

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

{
local $/ = "\n===";
open(FILE2,"<$file2") or die $!;
while(<FILE2>){
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($filteredLines{$ip}){
print $_,"\n" for(@{$filteredLines{$ip}});
}
} # if
}
}
close FILE2;


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


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.1
password: test2

asvklhaskdjvhasdv
sdvasdvasdvsdv
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/
misterx
 2005-03-31 13:13
#53018 #53018
User since
2005-03-28
23 Artikel
BenutzerIn
[default_avatar]
hm, bekomme eine Fehlermeldung:
use of uninitialized value in string eq at script.pl und dann verweis auf die Zeile.
Bin noch auf der Fehlersuche..
Sorry, aber erst jetzt ist es mir aufgefallen, dass in der ip2.txt
nach time nicht ip und dann die nummer steht, sonder ipadress und die nummer, also:
Code: (dl )
1
2
3
4
5
6
7
8
====================================
time:  20050101101221
ipadress :  127.0.0.1
password:  password1

<html> hier der Text
</html>
===========================



Das macht aber nichts aus, denke ich. Oder doch?
Danke für Hinweise! Grüsse
Jetzt habe ich auch den Fehler gefunden:
Du liest zuerst ip1.txt, dann ip2.txt,
ich muss aber zuerst ip2.txt einlesen, dann ip1.txt.
Deswegen die Fehlermeldung. Hm, kann man es ändern? Wenn ich die Bezeichnung vertausche, funktioniert es nicht...\n\n

<!--EDIT|misterx|1112261131-->
renee
 2005-03-31 14:03
#53019 #53019
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
dann ändere mal my ($ip) = $_ =~ m/ip\s*?:\s+([^\s]+)/s; in
my ($ip) = $_ =~ m/ip(?:address)?\s*?:\s+([^\s]+)/s;
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/
misterx
 2005-03-31 14:24
#53020 #53020
User since
2005-03-28
23 Artikel
BenutzerIn
[default_avatar]
Tatsächlich, es funktioniert jetzt. Habe es angepasst.
Andere frage (es wird ja immer komplizierter..):

Wenn ich es als Option anbieten muss (ip oder password; nur ip; nur password), wie kann ich es anpassen?
D.h. wenn ich nur die ip eingebe, wird nach der ip in beiden .txt Dateien gesucht; wenn ich nur das password eingebe (also ohne ip), wird nur nach dem gleichen password in der Datei gesucht.
Geht sowas? Ich versuche mal AND durch logisches OR zu ersetzen.
Danke nochmal 1000fach!
Grüsse
---------
EDIT: Mit nur password geht, aber mit nur ip geht nicht, weil in der if-Schleife die 2 Bedingungen angegeben sind.
Kann man da eine Case-Anweisung mit switch machen?
Wenn password eingegeben, filtere nach password und zeige die ips an. wenn ip angegeben, dann filtere nach ip und zeige die zugehörigen passwörter an.
Wenn beides angegeben, dann  (ja, das macht das Skript schon).
Wenn nichts angegeben, nur die Namen der beiden Textdateien, dann gebe mir die Anzahl der Elemente aus.
Kann da vielleicht jemand helfen? Ist schon ziemlich hart, es hinzubekommen..
DANKE!

Wichtig ist mir, dass die Gesamtzahl der IPs gezählt wird, d.h. wenn ich die ip eingebe -oder password (dazu gehört auch eine ip), oder beides, wird mir gesagt z.B.

in ip1.txt z.B. 4 der eingegebenen ips gefunden
in ip2.txt z.B. 5 der eingegebenen ips gefunden.

D.h. ich müsste es alles als ein array einlesen - so in der art:
ein grosses array für ip1.txt
ein grosses array für ip2.txt
dann die Filterung, also mit ipeingabe, oder password-eingabe, oder beides
und dann der vergleich zwischen diesen beiden .txt-Dateien anhand eben dieser 2 arrays.

Uff, lese auch noch die anderen manuals für perl durch, vielleicht finde ich ja paar Hinweise. Danke für Eure Antworten und Anregungen!
Grüsse\n\n

<!--EDIT|misterx|1112266624-->
renee
 2005-03-31 14:53
#53021 #53021
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
if ($pass eq $filterPassword and $ip eq $filterIp) { ==>
Code: (dl )
1
2
3
  if ((!$pass && $ip eq $filterIp) 
|| ($pass eq $filterPassword && ! $ip)
|| ($pass eq $filterPassword and $ip eq $filterIp)) {



if ($help) { ==>
Code: (dl )
if ($help || !($filterPassword && $ip)) {
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/
misterx
 2005-03-31 14:59
#53022 #53022
User since
2005-03-28
23 Artikel
BenutzerIn
[default_avatar]
Danke! Teste es auch gleich. Habe auch in der Zwischenzeit geantwortet, vielleicht kannst Du mir noch paar Tipps geben: siehe Beitrag davor ab:

Wichtig ist mir, dass die Gesamtzahl der IPs gezählt wird,...
renee
 2005-03-31 15:20
#53023 #53023
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
while (<LOG>) { ==>
Code: (dl )
1
2
3
my $counter_file1 = 0;
while (<LOG>) {
$counter_file1++;


while(<FILE2>){
next unless($_ =~ m/ip/s);
==>
Code: (dl )
1
2
3
4
my $counter_file2 = 0;
while(<FILE2>){
next unless($_ =~ m/ip/s);
$counter_file2++;


Am Ende dann halt noch noch
Code: (dl )
1
2
3
4
print qq~
IPs in $file: $counter_file1
IPs in $file2: $counter_file2
~;
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/
misterx
 2005-03-31 16:08
#53024 #53024
User since
2005-03-28
23 Artikel
BenutzerIn
[default_avatar]
[quote=renee,31.03.2005, 12:53] if ($pass eq $filterPassword and $ip eq $filterIp) { ==>
Code: (dl )
1
2
3
  if ((!$pass && $ip eq $filterIp) 
      || ($pass eq $filterPassword && ! $ip)
      || ($pass eq $filterPassword and $ip eq $filterIp)) {



if ($help) { ==>
Code: (dl )
if ($help || !($filterPassword && $ip)) {
[/quote]
Hier bekomme ich einen Fehler, wenn ich es starte mit:

perl -w script.pl -ip 127.0.0.1 -file ip1.txt -file2 ip2.txt

(also ohne password), dann erscheint uninitializierter Wert in string eq..
Hm, bin noch am testen, aber wenn ich es so eingebe, kommt auch eine Fehlermeldung (diesmal nur password ohne ip):

perl -w script.pl -password test -file ip1.txt -file2 ip2.txt

Mal sehen, wodrann es liegt.
Grüsse
<< |< 1 2 3 4 >| >> 34 Einträge, 4 Seiten



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