Schrift
[thread]6821[/thread]

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



<< |< 1 2 3 4 >| >> 34 Einträge, 4 Seiten
Gast Gast
 2005-03-29 18:03
#53005 #53005
Danke für die Tipps! Es funktioniert. Andere Frage:
kann ich die IPs in ein array einlesen? Die ips sind in der log Datei getrennt nach Leerzeichen; also dachte ich an

@line = split($_, ' ');

. Geht sowas? Und wie kann ich dann auf dieses array zugreifen? D.h. dass mir das array die Anzahl der Elemente ausgibt, also z.B. 120 ips gezählt.
Danke!
renee
 2005-03-29 18:06
#53006 #53006
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Du hast es _fast_ richtig gemacht:

Code: (dl )
1
2
my @ips = split(/ /,$line); # in $line steht die Zeile mit den IPs
print "Es sind ",scalar(@ips)," IPs\n"; # scalar() liefert die Anzahl der Elemente
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-29 23:45
#53007 #53007
User since
2005-03-28
23 Artikel
BenutzerIn
[default_avatar]
Danke für die Antwort! Es hilft mir sehr. Werde es aber erst morgen ausprobieren können.

noch eine Frage, ist etwas kompliziert, hängt aber mit allem, was ich bisher gefragt habe, zusammen.
OK. Ich habe eine Textdatei (file.txt), die ist so aufgebaut:

1111397393 password 127.0.0.1 1111398394 10
1111397393 password2 127.0.0.1 1111398394 11
1111397393 password3 127.0.0.1 1111398394 12

d.h. besteht aus 5 Elementen:
timestamp passwort ip timestamp ID-key.
Jetzt möchte ich meinem script auf der commandline sagen:

<script> -pass <password> -ip <ipadresse> -t <filename.txt>

d.h. wenn ich diese file.txt mit vielen Einträgen der Art wie oben beschrieben einlese, gebe ich an, mit welchem passwort und welcher ip er mir die Sachen in ein Array filtern soll; also wenn ich eingebe:

<script> -pass password3 - ip 127.0.0.1 -t file.txt

dann wird mir der zugehörige Eintrag aus der Datei gefiltert, wo das passwort3 ist und die ip 127.0.0.1 ist.
Die anderen 3 merkmale bleiben im array enthalten (also die zwei timestamps und ID-key).

Ich dachte an ein array mit 5 Elementen, und dann ein array of array mit eben diesen 2 gefilterten Elementen (password und ipadresse).
Es werden im array mit 5 "Spalten" also alle Zeilen der file.txt eingelesen (z.B. 1111397393 password 127.0.0.1 1111398394 10) - es können auch z.B. 70 Einträge sein, wenn die file.txt eben 70 Einträge enthält, halt in 5 Spalten, wie oben beschrieben, also timestamp passwort ip timestamp ID-key.
Und z.B. aus diesen 70 Einträgen, die jetzt im array sind, sollen mir die gefiltert werden, die ich auf der commandozeile eingegeben habe  (also  z.B. <script> -pass password3 - ip 127.0.0.1 -t file.txt ; in dem fall alle Einträge, die password3 und die ip 127.0.0.1 nutzen).

Uff, nicht das ich untätig wäre; ich habe so probiert:

Code: (dl )
1
2
3
4
5
6
GetOptions( 
           "p|=s"         => \$password,
           "i|ip=s"            => \$ip,
           "f|fille=s"       => \$file,
           "h|help"            => \$help,
            )

Aber jetzt weiss ich nicht ganz weiter..
Danke für die Hinweise und Anregungen!
Grüsse\n\n

<!--EDIT|misterx|1112125705-->
Strat
 2005-03-30 11:12
#53008 #53008
User since
2003-08-04
5246 Artikel
ModeratorIn
[Homepage] [default_avatar]
etwa so in der art?
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
#! /usr/bin/perl
use warnings;
use strict;
use Getopt::Long;

my ($filterPassword, $filterIp, $file);
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,
"help" => \$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) {
print "gefiltert: $_\n";
push (@filteredLines, $_);
} # if
} # while
close (LOG);

foreach (@filteredLines) {
print "$_\n";
} # foreach


oder als einzeiler:
Code: (dl )
perl -ne "@cols=split(/ /); print if $cols[1] eq 'geheim' and $cols[2] eq '127.0.0.1'" file.txt

(Bis man sich an das genaue Parameterformat erinnert, ist der Einzeiler wohl schon zwei Mal getippt...)\n\n

<!--EDIT|Strat|1112166938-->
perl -le "s::*erlco'unaty.'.dk':e,y;*kn:ai;penmic;;print"
http://www.fabiani.net/
Gast Gast
 2005-03-30 12:55
#53009 #53009
Danke für die Antwort!
Ich übergebe die Parameter dem Skript, bekomme aber nichts als Ausgabe zu sehen. Er macht es und beendet sich.
Den Einzeiler habe ich noch nicht getestet, werde es aber gleich tun.
Danke und Grüsse
misterx
 2005-03-30 14:04
#53010 #53010
User since
2005-03-28
23 Artikel
BenutzerIn
[default_avatar]
[quote=Strat,30.03.2005, 09:12]etwa so in der art?
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
#! /usr/bin/perl
use warnings;
use strict;
use Getopt::Long;

my ($filterPassword, $filterIp, $file);
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,
 "help"          => \$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) {
   print "gefiltert: $_\n";
   push (@filteredLines, $_);
 } # if
} # while
close (LOG);

foreach (@filteredLines) {
 print "$_\n";
} # foreach
[/quote]
Danke, ich habe es ausprobiert. Es erscheint aber überhaupt nichts - scheint ok zu sein, aber er gibt mir das array nicht aus, und auch nicht, ob es gefiltert wurde.
Probiere es aber die ganze Zeit, vielleicht klappt es ja.

Kann man es erweitern? Ich muss noch eine Datei einlesen, also in GetOptions file2=s" => \$file2 - auch eine Textdatei, die dieselben Einträge (also ip, password enthält).
Ich möchte dann auf der Commandozeile sagen:

program.pl -p password -i 127.0.0.1 -file datei.txt -file2 datei2.txt.

Das würde in diesem Fall beudeuten, dass mir das password und ip adresse, welche ich eingegeben habe, nur ausgegeben wird, wenn sie in beiden Text-dateien enthalten ist.

Also es wird zuerst die erste Datei komplett eingelsen, dann die zweite, und dann wird erst gefiltert nach den Eingaben: password und ip; und ausgegeben, wenn sie nur exakt in beiden Textdateien enthalten sind.
Bsp:
textdatei1.txt

127.0.0.1 password1 id1
127.0.0.2 password2 id2
...

textdatei2.txt
129.0.0.1 test1 id4
129.0.0.2 test3 id5
127.0.0.1 password1 id1

wenn ich jetzt eingebe:

program.pl -p password1 -i 127.0.0.1 -file textdatei1.txt -file2 textdatei2.txt

dann bekomme ich zu sehen:
password1 127.0.0.1; weil es in beiden Textdateien enthalten ist. Danke für die Antwort bzw.Anregungen!
Grüsse
renee
 2005-03-30 14:47
#53011 #53011
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
#! /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,
"help" => \$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 ($ip, $pass) = split(/ /, $_);
if ($pass eq $filterPassword and $ip eq $filterIp) {
$filteredLines{$_} = 1;
} # if
} # while
close (LOG);

open(FILE2,"<$file2") or die $!;
while(<FILE2>){
chomp $_;
my ($ip, $pass) = split(/ /, $_);
if ($pass eq $filterPassword and $ip eq $filterIp) {
print $_,"\n" if($filteredLines{$_});
} # if
}
close FILE2;


Das funktioniert mit den beiden .txt-Dateien, die Du gepostet hast...
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-30 15:28
#53012 #53012
User since
2005-03-28
23 Artikel
BenutzerIn
[default_avatar]
Prinzipiell JA. Aber ich bekomme keine Ausgabe auf dem Bildschirm. Nachdem ich es ausgeführt habe, bin ich wieder in perl\bin, und das wars. Wodrann kann es liegen?
Ich bekomme auch keine Ausgabe von
print "gefiltert: $_\n";

d.h. doch, dass es nicht genommen wird, oder?
Danke für die schnellen Antworten! Es bringt mich wirklich weiter :-)
Grüsse
-----------
EDIT: wenn ich es ohne die Atturibute starte, also
perl -w skript.pl
erscheint:
use of uninitialized value in concatenation <.> or string und dann verweis auf die Zeile nach open.\n\n

<!--EDIT|misterx|1112182698-->
renee
 2005-03-30 16:00
#53013 #53013
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Bei mir sehen die txts so aus...

ip1.txt:
Code: (dl )
1
2
127.0.0.1 password1 id1
127.0.0.2 password2 id2


ip2.txt:
Code: (dl )
1
2
3
129.0.0.1 test1 id4
129.0.0.2 test3 id5
127.0.0.1 password1 id1


Aufruf: perl skript.pl -ip 127.0.0.1 -password password1 -file ip1.txt -file2 ip2.txt

Code: (dl )
1
2
~ 34> perl test_ip.pl -ip 127.0.0.1 -password password1 -file ip1.txt -file2 ip2.txt
127.0.0.1 password1 id1
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-30 23:18
#53014 #53014
User since
2005-03-28
23 Artikel
BenutzerIn
[default_avatar]
renee, danke für die Tipps! Bin halt ein Java - Umsteiger, und habe so meine Schwierigkeiten mit Perl.

Es funktioniert, so wie Du es gepostet hast. Aber: ich weiss jetzt, wieso es bei mir nicht läuft.
Beide text-files sind im unix format; aber file2 hat nicht die gleiche Reihenfolge, sondern enthält die ip und password verteilt über die ganze Datei hintereinander; dann kommt wieder eine xml-struktur, und dann nach 20 Zeilen wieder die ip samt password. Deswegen habe ich ganz oben im Beitrag nachgefragt, wie man die ips mit regexp rausfinden kann.
Kann ich es auch noch da in einer Schleife einbauen?

Wenn Du z.B. bei Dir, wie gepostet, in ip2.txt die Sachen so hintereinander schreibst:
Code: (dl )
 129.0.0.1 test1 id4 129.0.0.2 test3 id5 127.0.0.1 password1 id1 
, dann funktioniert es auch nicht.

Deswegen dachte in an sowas, dass man zuerst alles in einem array ablegt, was eingelesen wird (also die ip, password und ip-id) und dann rausgefiltert wird (die ip und password), wenn sie mit ip1.txt übereinstimmen.

Man bekommt also ein array z.b. mit 70 Einträgen, falls soviele in ip1.txt vorhanden sind, und bei Übereinstimmung (password und ip) mit ip2.txt werden diese ausgegeben als array; also eine Art array von array. Habe schon in perldoc nachgelesen, wie man soetwas bildet; hier ist es aber etwas umfangreicher, deswegen bin ich noch am probieren.
Danke für die Vorschläge!
Grüsse
<< |< 1 2 3 4 >| >> 34 Einträge, 4 Seiten



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