RegExp über zwei Zeilen

30/04/2009 - 17:27 von Michael Daunheimer | Report spam
Hallo zusammen,

ich suche eine Möglichkeit, die folgenden zwei *funktionierenden*
RegExps zusammen zu fassen:

failregex = \(\S+\[<HOST>\]\): USER \S+ \(Login failed\): Incorrect
password\.$
matcht die Logmeldung:
Apr 30 16:54:47 this_machine proftpd[5998] this_machine
(dslb.net[153.42.113.201]): USER michael (Login failed): Incorrect password.

und
failregex = \(\S+\[<HOST>\]\): USER \S+: no such user found from \S+
\[[0-9.]+\] to \S+:\S+$
matcht die Logmeldung:
Apr 30 16:55:39 this_machine proftpd[6002] this_machine
(dslb.net[153.42.113.201]): USER andereruser: no such user found from
dslb.net[153.42.113.201] to 172.16.160.70:21


Laut http://www.fail2ban.org/wiki/index.php/MANUAL_0_8 brauche ich die
Ausdrücke nur in zwei Zeilen zu schreiben, aber folgendes matcht leider
gar nicht mehr:
failregex = \(\S+\[<HOST>\]\): USER \S+ \(Login failed\): Incorrect
password\.$
\(\S+\[<HOST>\]\): USER \S+: no such user found from \S+
\[[0-9.]+\] to \S+:\S+$


Weiß jemand Rat, wie ich das zusammen fassen kann, so dass ich beide
Logmeldungen beim Parsen finde?

Vielen Dank für Eure Hilfe!
Michael
 

Lesen sie die antworten

#1 Peter J. Holzer
01/05/2009 - 09:23 | Warnen spam
On 2009-04-30 15:27, Michael Daunheimer wrote:
ich suche eine Möglichkeit, die folgenden zwei *funktionierenden*
RegExps zusammen zu fassen:

failregex = \(\S+\[<HOST>\]\): USER \S+ \(Login failed\): Incorrect
password\.$
matcht die Logmeldung:
Apr 30 16:54:47 this_machine proftpd[5998] this_machine
(dslb.net[153.42.113.201]): USER michael (Login failed): Incorrect password.

und
failregex = \(\S+\[<HOST>\]\): USER \S+: no such user found from \S+
\[[0-9.]+\] to \S+:\S+$
matcht die Logmeldung:
Apr 30 16:55:39 this_machine proftpd[6002] this_machine
(dslb.net[153.42.113.201]): USER andereruser: no such user found from
dslb.net[153.42.113.201] to 172.16.160.70:21


Laut http://www.fail2ban.org/wiki/index.php/MANUAL_0_8 brauche ich die
Ausdrücke nur in zwei Zeilen zu schreiben, aber folgendes matcht leider
gar nicht mehr:
failregex = \(\S+\[<HOST>\]\): USER \S+ \(Login failed\): Incorrect
password\.$
\(\S+\[<HOST>\]\): USER \S+: no such user found from \S+
\[[0-9.]+\] to \S+:\S+$



Bei mir matchen zunàchst einmal beide nicht. <HOST> wird offenbar von
fail2ban expandiert, ich habe das durch qr/[0-9.]+/ ersetzt. Außerdem
ist durch Deinen Zeilenumbruch ein Leerzeichen in die zweite Regex
geraten, das auch noch rausgehört (bitte verwende einen
Newsreader/Editor, der nicht ungefragt an unpassenden Stellen
Zeilenumbrüche einfügt).

Weiß jemand Rat, wie ich das zusammen fassen kann, so dass ich beide
Logmeldungen beim Parsen finde?



Prinzipiell matcht qr/regex1|regex2/ alles, was entweder qr/regex1/ oder
qr/regex2/ matcht. Du kannst also die beiden Regexes einfach durch "|"
getrennt hintereinander schreiben.

Da aber beide Regexes einen gemeinsamen Anfang haben, làsst sich zu
qr/gemeinsamer Anfang(Rest von Regex1|Rest von Regex2)/ vereinfachen.


#!/usr/bin/perl
use warnings;
use strict;

my $host = qr/[0-9.]+/;
my $re1 = qr/\(\S+\[$host\]\): USER \S+ \(Login failed\)/;
my $re2 = qr/\(\S+\[$host\]\): USER \S+: no such user found from \S+\[[0-9.]+\] to \S+:\S+$/;
my $re3 = qr/\(\S+\[$host\]\): USER \S+( \(Login failed\)|: no such user found from \S+\[[0-9.]+\] to \S+:\S+$)/;

while (<DATA>) {
if (/$re1/) {
print " re1";
}
if (/$re2/) {
print " re2";
}
if (/$re3/) {
print " re3";
}
print "";
}

__DATA__
Apr 30 16:54:47 this_machine proftpd[5998] this_machine (dslb.net[153.42.113.201]): USER michael (Login failed): Incorrect password.
Apr 30 16:55:39 this_machine proftpd[6002] this_machine (dslb.net[153.42.113.201]): USER andereruser: no such user found from dslb.net[153.42.113.201] to 172.16.160.70:21


hp

Ähnliche fragen