Schrift
[thread]9032[/thread]

Zeilen suchen und in andere Datei schreiben: .. Ein Newbie sucht Hilfe



<< >> 9 Einträge, 1 Seite
Gast Gast
 2007-05-24 22:52
#76896 #76896
Tach auch,

ich bin blutiger Anfänger in Sachen Perl, vielleicht kann mir jemand eine Hilfestellung geben für meine Aufgabe:

Ich möchte eine Datei auf einen vordefinierten String suchen (in meinem Fall "Greylisted").
Kommt dieser String in einer Zeile vor, sollen aus dieser Zeile die ersten 15 Zeichen kopiert werden (da steht das Datum drin, ist immer 15 Zeichen lang) und ein weiterer String, welcher weiter hinten durch das Wort "RCPT from" und einen doppelpunkt eingeschlossen ist.

Hat hierfür jemand einen Vorschlag?

Danke & Gruß
Thomas
pq
 2007-05-24 23:06
#76897 #76897
User since
2003-08-04
12208 Artikel
Admin1
[Homepage]
user image
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
# öffne datei oder stirb
open my $fh, '<', $filename or die $!;
# neue datei anlegen
open my $out, '>', $new_filename or die $!;
# lies zeile für zeile
while (my $line = <$fh>) {
 if ($line =~ m/\bGreylisted\b/) {
   # wenn Greylisted als wort vorkommt,
   # schreibe in die neue datei
   print $out substr($line, 0, 15) . "\n";
 }
}
close $fh;
close $out;

siehe auch
perlopentut
perlfunc
perlretut
Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live. -- Damian Conway in "Perl Best Practices"
lesen: Wiki:Wie frage ich & perlintro Wiki:brian's Leitfaden für jedes Perl-Problem
skynetworks
 2007-05-24 23:38
#76898 #76898
User since
2007-05-24
10 Artikel
BenutzerIn
[default_avatar]
Holla, danke für die schnelle Antwort!

funktioniert aber anscheinend noch nicht so ganz, erhalte folgende Fehlermeldung:
./test3.pl: line 6: syntax error near unexpected token `)'
./test3.pl: line 6: `while (my $line = <$fh>) '

Ich habe das input- und outputfile im Code wie folgt eingefügt, ist das richtig?

Code: (dl )
1
2
3
4
# öffne datei oder stirb
open my $fh, '<', $/var/log/mail.log.0 or die $!;
# neue datei anlegen
open my $out, '>', $/var/log/ausgabe.log or die $!;


Danke & Gruss
Thomas
Linuxer
 2007-05-24 23:45
#76899 #76899
User since
2006-01-27
3890 Artikel
HausmeisterIn

user image
Nein,

das ist so nicht richtig.

$filename ist eine Variable; das $ gehört zur Variable.

Also entweder schreibst Du es so:
Code: (dl )
1
2
my $filename = '/var/log/mail.log.0';
open my $fh, '<', $filename or die "$filename: $!";


oder so:

Code: (dl )
open my $fh, '<', '/var/log/mail.log.0' or die "/var/log/mail.log.0: $!";


Den String hinter die kannst Du individuell gestalten; mir persönlich ist es lieber, bei der Fehlermeldung auch den Dateinamen zu sehen, zu dem der Fehler gehört.

Zu Bevorzugen ist die erste Variante (die mit der Variable $filename), weil Du dadurch flexibler bist, solltest Du das Skript einmal anpassen müssen (Du musst dann nur die Zuweisung für $filename anpassen, und nicht jedes Vorkommen des Dateipfades suchen und anpassen).
meine Beiträge: I.d.R. alle Angaben ohne Gewähr und auf Linux abgestimmt!
Die Sprache heisst Perl, nicht PERL. - Bitte Crossposts als solche kenntlich machen!
skynetworks
 2007-05-25 00:15
#76900 #76900
User since
2007-05-24
10 Artikel
BenutzerIn
[default_avatar]
OK, funktioniert soweit! Danke zunächst... :)

Ich bekomme im Moment allerdings nur das Datum kopiert und nicht den 2. Teil der Zeile, den ich noch benötige:
Quote
... und ein weiterer String, welcher weiter hinten durch das Wort "RCPT from" und einen doppelpunkt eingeschlossen ist.


Vielleicht hat hierfür noch jemand einen Vorschlag?

Danke & Gruss
Thomas
Linuxer
 2007-05-25 00:38
#76901 #76901
User since
2006-01-27
3890 Artikel
HausmeisterIn

user image
Zusammen mit pqs Vorarbeit:

Code: (dl )
1
2
3
4
5
6
while ( $line = <$fh> ) {
# nur wenn ein String nach "RCPT from" gefunden wird, wird eine Ausgabe gemacht
if ( $line =~ m/RCPT from\s*(.*?):/ ) {
print $out substr( $line, 0, 15 ) . ' : ' . $1 . $/;
}
}
meine Beiträge: I.d.R. alle Angaben ohne Gewähr und auf Linux abgestimmt!
Die Sprache heisst Perl, nicht PERL. - Bitte Crossposts als solche kenntlich machen!
RalphFFM
 2007-05-25 00:38
#76902 #76902
User since
2006-11-16
258 Artikel
BenutzerIn
[Homepage] [default_avatar]
# ungetestet
while(<fh>){
if (/^(.{15}).*Greylisted.*RCPT from([^:]+):/) {
print "Datum: $1, Absender: $2\n"; # o.ä. ...
}
}
pq
 2007-05-25 00:42
#76903 #76903
User since
2003-08-04
12208 Artikel
Admin1
[Homepage]
user image
dann mach aus
Code: (dl )
if ($line =~ m/\bGreylisted\b/) {

Code: (dl )
if (my ($string) = $line =~ m/\bGreylisted\b.*RCPT from(.*?):/) {

dann steht in $string der gewünschte string. lies dazu bitte mal die
doku, die ich verlinkt habe (perlretut)
Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live. -- Damian Conway in "Perl Best Practices"
lesen: Wiki:Wie frage ich & perlintro Wiki:brian's Leitfaden für jedes Perl-Problem
skynetworks
 2007-05-25 00:45
#76904 #76904
User since
2007-05-24
10 Artikel
BenutzerIn
[default_avatar]
Top.... Funktioniert genau so wie's soll....

Tausend dank nochmal an alle!

Gruss
Thomas
<< >> 9 Einträge, 1 Seite



View all threads created 2007-05-24 22:52.