用于多种类型的os日志的正则表达式

时间:2016-04-28 18:15:10

标签: regex bash perl

我需要提取日志的Ip并尝试搜索一些示例。对于其他行日志获取几个示例,但我无法应用于此案例。

我是糟糕的程序员,更糟糕的是正则表达式。试试http://rubular.com,但不是我没有得到表达式

Apr-28-16 04:16:33 [SSL-out] 111.111.111.111 warning: SMTP authentication failed;
Apr-28-16 04:28:35 222.222.222.222 warning: SMTP authentication failed;

在bash脚本CSf防火墙的基础上,使用regex expression perl调整SMTP身份验证失败时,我需要提取IP

2 个答案:

答案 0 :(得分:1)

如果您要捕获的每一行都有“SMTP身份验证失败”,那么这应该可以解决问题。它捕获IP(以初步方式)并将其放入$1如果有IP后跟“SMTP认证失败”。

use warnings;
use strict;

while (<DATA>){
    if (/(\d+\.\d+\.\d+\.\d+)(?=.*?SMTP\s+authentication\s+failed)/){
        print "$1\n";
    }
}

__DATA__
Apr-28-16 04:16:33 [SSL-out] 111.111.111.111 warning: SMTP authentication failed;
Apr-28-16 04:16:33 [SSL-out] 111.111.111.112 warning: SMTP authentication success;
Apr-28-16 04:16:33 [SSL-out] 111.111.111.113 warning: SMTP authentication failed;
Apr-28-16 04:28:35 222.222.222.222 warning: SMTP authentication failed;

输出:

111.111.111.111
111.111.111.113
222.222.222.222

答案 1 :(得分:1)

此模式获取IP地址,后面跟着“SMTP身份验证失败”&#39;如果找到匹配则输出它们。 IP模式并不完美(因为它允许例如123.456.000.999),但它是一个良好的开端。

#!/usr/bin/env perl

use strict;
use warnings;

while(my $line = <DATA>) {
    if (my ($ip) = ($line=~/(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}).*SMTP authentication failed/)) {
        print "faulty ip=$ip\n";
    } 
}

__DATA__
Apr-28-16 04:16:33 [SSL-out] 111.111.111.111 warning: SMTP authentication failed;
Apr-28-16 04:28:35 222.222.222.222 warning: SMTP authentication failed;

输出:

faulty ip=111.111.111.111
faulty ip=222.222.222.222