Schrift
[thread]9924[/thread]

perl-script zur Mail-log Auswertung



<< |< 1 2 >| >> 13 Einträge, 2 Seiten
skynetworks
 2007-08-01 21:53
#97166 #97166
User since
2007-05-24
10 Artikel
BenutzerIn
[default_avatar]
Hallo zusammen,

ich habe da eine kleine Frage zu einem bestehenden Perl-Script.
Das Programm listet mir alle Rejects aus dem Mail-Logfile auf, funktioniert soweit bestens.

Ich hätte gerne, daß wenn der Suchstring gefunden wird, aus dieser Zeile die from-Mailadresse, welche durch die Zeichen from=< und > und die to-Mailadresse, welche durch to=< und > begrenzt sind, in das Ziel-File ausgegeben wird. Die Uhrzeit soll auch mitgeschrieben werden, das funktioniert mit dem bisherigen code schon (sind immer die Zeichen 0 bis 15).

Und noch eine Frage: Im Suchstring möchte ich auch gerne Sonder- und Leerzeichen verwenden z.B. "reject ", also ein Leerzeichen nach dem reject. Wenn ich also

if ($line =~ m/\breject \b/)

angebe, erhalte ich im Zielfile keine Ausgabe.

Wie wäre das Programm denn zu verändern?

Hier der bisherige Code:
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
#!/usr/bin/perl
use strict;
use warnings 'all';

# dateinamen
my $inputfile = '/var/log/mail.log.1';
my $outputfile = '/var/www/alle_rejects.txt';

# oeffne inputfile
open(my$fhin, '<', $inputfile) or die "$inputfile: $!";

# array f�r die ausgabe
my @output;

# lies zeile f�r zeile
while (my$line = <$fhin>)
{
if ($line =~ m/\breject\b/)
{
# wenn der Suchstring "reject" vorkommt,
# und "from" gefunden wird,
# wird das ausgabearray erweitert

if ( $line =~ m/from\s*(.*?):/ )
{ push(@output, substr( $line, 0, 15 ) .' : '. $1) }

}
}

# inputfile schliessen
close $fhin;

# ausgabearray bearbeiten
unshift(@output, $#output+2);

# oeffne outputfile
open(my$fhout, '>', $outputfile) or die "$outputfile: $!";

# daten rausschreiben
map { print $fhout "$_$/" } @output;

# outputfile schliessen
close $fhout;



Vielen Dank im Voraus für einen Tip,

Viele Grüße
Thomas
#Kein Kommentar
 2007-08-01 22:12
#97168 #97168
User since
2007-06-09
575 Artikel
HausmeisterIn
[default_avatar]
das mit dem


if ($line =~ m/\breject \b/)


könnte man so erklären, dass in $line "bla bla reject bla bla" steht,
sodass nur ein Leerzeichen da steht, aber Perl noch eins durch \b erwartet.
vielleicht sollte man es besser so schreiben:

Code: (dl )
if ($line =~ m/\breject \b*/)


Hilft dir das weiter?
Gerade weil wir alle in einem Boot sitzen, sollten wir froh sein, dass nicht alle auf unserer Seite sind
renee
 2007-08-01 23:59
#97183 #97183
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
#Kein Kommentar+2007-08-01 20:12:52--
das mit dem


if ($line =~ m/\breject \b/)


könnte man so erklären, dass in $line "bla bla reject bla bla" steht,
sodass nur ein Leerzeichen da steht, aber Perl noch eins durch \b erwartet.

Nein, \b ne \s. Unter \b fallen mehrere Sachen...
Quote
vielleicht sollte man es besser so schreiben:

Code: (dl )
if ($line =~ m/\breject \b*/)


Hilft dir das weiter?

Noch besser einfach \breject\b
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/
skynetworks
 2007-08-02 11:13
#97208 #97208
User since
2007-05-24
10 Artikel
BenutzerIn
[default_avatar]
Hallo zusammen,

funktioniert beides nicht so recht:
mit
if ($line =~ m/\breject \b*/)

bekomme ich den Fehler:
\b* matches null string many times in regex; marked by <-- HERE in m/\breject \b* <-- HERE / at ./alle_rejects.pl line 18.

und mit
if ($line =~ m/\breject \b)

bekomme ich den Fehler:
Bareword found where operator expected at ./alle_rejects.pl line 24, near "if ( $line =~ m/from"
(Might be a runaway multi-line // string starting on line 18)
(Do you need to predeclare if?)
Backslash found where operator expected at ./alle_rejects.pl line 24, near "from\"
syntax error at ./alle_rejects.pl line 24, near "if ( $line =~ m/from"
Substitution replacement not terminated at ./alle_rejects.pl line 24.

Das wäre jetzt aber nicht so wild, die Filterfunktion, wie im 1. Posting angegeben wäre wichtiger.....

Danke für die Hilfe & Gruss
Thomas
Gast Gast
 2007-08-02 11:52
#97226 #97226
mache aus:
Code: (dl )
if ($line =~ m/\breject \b)

Code: (dl )
if ($line =~ m/\breject \b/)


MfG
#Kein Kommentar
 2007-08-02 12:42
#97236 #97236
User since
2007-06-09
575 Artikel
HausmeisterIn
[default_avatar]
renee+2007-08-01 21:59:19--
Nein, \b ne \s. Unter \b fallen mehrere Sachen...


aber \b ist doch im grunde wie \s

auszug aus der doku:
\b Match a word boundary

und eine wortunterbrechung ist doch \s ( ,\t,\r,\n,\f)
Gerade weil wir alle in einem Boot sitzen, sollten wir froh sein, dass nicht alle auf unserer Seite sind
renee
 2007-08-02 13:09
#97245 #97245
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
#Kein Kommentar+2007-08-02 10:42:52--
renee+2007-08-01 21:59:19--
Nein, \b ne \s. Unter \b fallen mehrere Sachen...


aber \b ist doch im grunde wie \s

auszug aus der doku:
\b Match a word boundary

und eine wortunterbrechung ist doch \s ( ,\t,\r,\n,\f)



\s ist eine kleine Schnittmenge mit \b...

Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#!/usr/bin/perl

use strict;
use warnings;

my @tests = (
    'Tester',
    'Test ist das',
    '(Test)was',
    'Test.',
    'Test,',
    'Test
    ',
    'Test&',
    'Test(',
    'Test123',
    '8Test-er',
);

for my $test ( @tests ){
    my $val = $test =~ /Test\b/ ? 'yes' : 'no';
    print sprintf "%13s: %s\n", $test, $val;
}


Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
C:\>word_boundary.pl
Tester: no
Test ist das: yes
(Test)was: yes
Test.: yes
Test,: yes
Test
: yes
Test&: yes
Test(: yes
Test123: no
8Test-er: yes
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/
pq
 2007-08-02 13:51
#97272 #97272
User since
2003-08-04
12208 Artikel
Admin1
[Homepage]
user image
#Kein Kommentar+2007-08-02 10:42:52--
aber \b ist doch im grunde wie \s

\b matcht eine wortgrenze, \s ein whitespace. d.h. bei dem string "Hallo Welt" matcht
\b die grenze zwischen dem Hallo und dem space, und zwischem dem space und Welt.
(und zwischen den wörtern und dem anfang/ende des strings).
d.h. \s matcht ein whitespace, also ein wirkliches zeichen. \b matcht kein zeichen, sondern
nur eine bestimmte stelle.
wenn du ein \s in klammern setzt, hast du hinterher in $1 das whitespace stehen. bei (\b)
hast du nix in $1 stehen.
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-08-02 21:53
#97347 #97347
User since
2007-05-24
10 Artikel
BenutzerIn
[default_avatar]
Tach zusammen,

also mit

if ($line =~ m/\breject \b/)

funktionierts.

Hat vielleicht noch jemand einen Tip für die andere Sache:
Ich hätte gerne, daß wenn der Suchstring gefunden wird, aus dieser Zeile die from-Mailadresse, welche durch die Zeichen from=< und > und die to-Mailadresse, welche durch to=< und > begrenzt sind, in das Ziel-File ausgegeben wird. Die Uhrzeit soll auch mitgeschrieben werden, das funktioniert mit dem bisherigen code schon (sind immer die Zeichen 0 bis 15).

Danke & Gruss
Thomas
renee
 2007-08-02 21:58
#97348 #97348
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Code (perl): (dl )
1
2
3
my ($from) = $line =~ /from=<(.*?)>/;
my ($to) = $line =~ /to=<(.*?)>/;
print $from, "::", $to;


einbauen musst Du es selbst ;)
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/
<< |< 1 2 >| >> 13 Einträge, 2 Seiten



View all threads created 2007-08-01 21:53.