Schrift
[thread]6468[/thread]

Textdatei auslesen und nach bestimmten Filterkrite



<< >> 8 Einträge, 1 Seite
Arasiel
 2004-08-06 11:43
#85466 #85466
User since
2003-11-12
39 Artikel
BenutzerIn
[default_avatar]
Hallo,
ich soll eine Textdatei mit Perl verarbeiten, weiss aber nicht wie!

Auszug aus dem Aufbau der Logdatei:

[08/05/2004 (18:13:32)]:
Adapter 1 Channel 1 Target 0:
Physical Drive[MAXTOR  ATLAS15K_36SCA  DTA0] is Changed to FAILED.

[08/05/2004 (18:17:20)]:
Adapter 1 Channel 1 Target 0:
Physical Drive[MAXTOR  ATLAS15K_36SCA  DTA0]is Changed to REBUILD.

[08/05/2004 (18:18:17)]:
Adapter 1 Channel 1 Target 0:
Physical Drive[MAXTOR  ATLAS15K_36SCA  DTA0]: REBUILD PROGRESS 1%

[08/05/2004 (19:35:11)]:
Adapter 1 Channel 1 Target 0:
Physical Drive[MAXTOR  ATLAS15K_36SCA  DTA0] is Changed to ONLINE.


Das Skript soll immer nach dem (beliebigen) Datumsfeld suchen und von dem ausgehend die nächsten 2 Zeilen, die auch noch dazu gehören,
zusammenhängend als String in eine Zeile schreiben.
Aber das alles soll es nur machen, wenn die Meldung "is Changed to" kommt

Die Ausgabe in die Datei soll so aussehen:

[08/05/2004 (18:13:32)]: ; Adapter 1 Channel 1 Target 0: ; Physical Drive[MAXTOR  ATLAS15K_36SCA  DTA0] is Changed to FAILED. ;
[08/05/2004 (18:17:20)]: ; Adapter 1 Channel 1 Target 0: ; Physical Drive[MAXTOR  ATLAS15K_36SCA  DTA0]is Changed to REBUILD. ;
[08/05/2004 (19:35:11)]: ; Adapter 1 Channel 1 Target 0: ; Physical Drive[MAXTOR  ATLAS15K_36SCA  DTA0] is Changed to ONLINE. ;

Wie man sieht wurde die Zeile übergangen, in der kein "is Changed to" steht. Und die einzelnen Sachen sind noch durch
einen ";" getrennt.

Ich hab schon so viel versucht, aber ich bekomm das mit den zu definierenden Filtern und Regeln einfach nicht hin.
Bitte um Hilfe und vielen Dank im Voraus!

Gruss,
Markus
renee
 2004-08-06 11:57
#85467 #85467
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
probier mal (ist ungetestet)
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
my $file = 'path/to/log.dat';
my $out = 'path/to/outfile.txt';

open(READ_LOG,"<$file") or die $!;
my @lines = <READ_LOG>;
close READ_LOG;
chomp(@lines);

my @entries = ();
for(0..$#lines){
 next unless($lines[$_] =~ /\[\d{2}\/\d{2}\/\d{4}/);
 push(@entries,$lines[$_].'; '.$lines[$_+1].'; '.$lines[$_+2]);
}

open(WRITE_OUT,">$out") or die $!;
for(@entries){
 print WRITE_OUT $_,"\n" if(index($_,'is Changed') != -1);
}
close WRITE_OUT;


edit: Fehler verbessert\n\n

<!--EDIT|renee|1091779303-->
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/
Arasiel
 2004-08-06 12:13
#85468 #85468
User since
2003-11-12
39 Artikel
BenutzerIn
[default_avatar]
Vielen Dank!
Das funktioniert auch, aber wenn zwischen den 3 auszugebenden Teilen mal eine Leerzeile ist, wird dieser String nicht ausgegeben:
z.B.:
[08/05/2004 (18:13:32)]:
Adapter 1 Channel 1 Target 0:

Physical Drive[MAXTOR ATLAS15K_36SCA DTA0] is Changed to FAILED.

Denn das kommt in der Logdatei auch manchmal vor.
Das ist aber auch noch wichtig. Gibts da auch noch eine Lösung?
Vielen Dank wiederrum im Voraus!
renee
 2004-08-06 12:22
#85469 #85469
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
my $file = 'path/to/log.dat';
my $out = 'path/to/outfile.txt';
my @lines = ();

open(READ_LOG,"<$file") or die $!;
while(my $line = <READ_LOG>){
 chomp($line);
 push(@lines,$line) if($line !~ /^\s*?$/);
}
close READ_LOG;

my @entries = ();
for(0..$#lines){
next unless($lines[$_] =~ /\[\d{2}\/\d{2}\/\d{4}/);
push(@entries,$lines[$_].'; '.$lines[$_+1].'; '.$lines[$_+2]);
}

open(WRITE_OUT,">$out") or die $!;
for(@entries){
print WRITE_OUT $_,"\n" if(index($_,'is Changed') != -1);
}
close WRITE_OUT;
\n\n

<!--EDIT|renee|1091780564-->
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/
Arasiel
 2004-08-06 12:31
#85470 #85470
User since
2003-11-12
39 Artikel
BenutzerIn
[default_avatar]
Jetzt funktionierts einwandfrei!
Vielen Dank nochmal für die tolle und extrem schnelle Hilfe!
Dubu
 2004-08-06 12:43
#85471 #85471
User since
2003-08-04
2145 Artikel
ModeratorIn + EditorIn

user image
@Renee: An deinen Beispielen stoert mich etwas, dass immer die Datei komplett in den Speicher gelesen wird. Ich habe teilweise mit Logdateien >100 MB zu tun, da wuerde Perl so leicht die Graetsche machen.

Ich schreibe Skripte auch lieber so, dass sie ihr Argument auf der Kommandozeile erhalten und nicht fest kodiert, und Ausgaben werden auf STDOUT geschrieben. So laesst sich das Programm sowohl mit Eingabe- und Ausgabedatei aufrufen (meinprogramm eingabe.dat > ausgabe.dat) als auch in einer Pipe (irgendeinprogramm | meinprogramm | weiteresprogramm). Aber ich bin eben auch Kommandozeilen-User ...


Hier mein Vorschlag:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
#!/usr/bin/perl
use strict;
use warnings;

$/ = "\n[";
while (<>) {
   next unless /is Changed to/;
   chomp;
   s/\s*\n\s*/; /g;
   s/^\[?/[/;
   print $_, "\n";
}
Crian
 2004-08-06 13:04
#85472 #85472
User since
2003-08-04
5870 Artikel
ModeratorIn
[Homepage]
user image
Das schreit doch nach einem dieser Config-Module, etwa Config::Simple\n\n

<!--EDIT|Crian|1091783297-->
s--Pevna-;s.([a-z]).chr((ord($1)-84)%26+97).gee; s^([A-Z])^chr((ord($1)-52)%26+65)^gee;print;

use strict; use warnings; Link zu meiner Perlseite
renee
 2004-08-06 13:10
#85473 #85473
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Normalerweise schreibe ich die Dateinamen auch nicht hardkodiert ins Programm sondern nutze Getopt::Long - gibt mir mehr Kontrolle was Usereingaben angeht, vor allem wenn es bis zu 10 Parameter sein dürfen (einige sind ja optional)...

Ich gebe Dir recht, dass es besser ist, vielleicht nicht alles in den Speicher zu nehmen... Ich werd's mir mal ins Hirn brennen ;)
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/
<< >> 8 Einträge, 1 Seite



View all threads created 2004-08-06 11:43.