Reguläre ausdrücke, strings beschneiden
ingo
- perl
Hallo, ich möchte einzelne Zeilen aus einem Logfile lesen. Mein Suchstring ist ein Datum/Urzeit an (Dec 31 22:00:00) zum Teil kommen aber noch verschiedenste Zeichen davor. Es gibt dabei auch Zeilen ohne diesen String, die sollen gefiltert werden. Bei meinme Beispiel werden zwar die richtigen Zeilen gefunden, ich möchte aber noch die zeichen vor dem String wegschneiden, meine Idee war mit index() nach dem Ausdruck zu suchen, das geht aber nicht, es kommt folgender Fehler.
Use of uninitialized value in print at splitter.pl line 10
substr outside of string at splitter.pl line 10
Hier mal mein Testcode:
$muster = '\w{3}\s{1}\d{1,2}\s{1}\d{2}:\d{2}:\d{2}';
$fh = new FileHandle;
if ( $fh->open( $ARGV[0] , "<" ) ) {
while ( my $inLine = $fh->getline ) {
if ($inLine =~ m/$muster/) {
print substr (index ($inLine, m/$muster/),length ($inLine));
}
}
}
Vielleicht kann mir einer von euch helfen. Noch einmal die Aufgabe: ich duche nach dem Ausdruck und will angefangen vom Ausdruck den Rest der Zeile in eine Datei schreiben.
Tag ingo.
ich suche nach dem Ausdruck und will angefangen vom Ausdruck den Rest der Zeile in eine Datei schreiben.
So könnte es gehen:
$muster = '(\w{3}\s{1}\d{1,2}\s{1}\d{2}:\d{2}:\d{2}.*?)$';
$fh = new FileHandle;
if ( $fh->open( $ARGV[0] , "<" ) ) {
while ( my $inLine = $fh->getline ) {
if ($inLine =~ m/$muster/) {
@ergebnis = $inLine =~ m/$muster/;
print @ergebnis;
}
}
}
Wichtig sind die Änderungen im RegExp: die Klammerung und das "Einfangen" der restlichen Zeile bis zum Ende (Begrenzer "$"). Siehe auch Reguläre Ausdrücke: Listen-Kontext. Das Ganze geht aber bestimmt auch anders und/oder eleganter :)
[dsf 3.6]
Siechfred