2016-04-28 83 views
-3

我需要提取日志的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; 

我需要的时候状态它的SMTP认证失败,正则表达式以Perl为基础,在bash脚本CSF防火墙

+0

问题是我们没有固定格式的模式。这从你的例子本身是明显的 – sjsam

+1

@Borodin - 编辑是完全不合适的。请不要再这样做。 –

+0

@布拉德森:请解释一下自己。你真的在说你已经回复的原始主题更好吗?我使用了OP自己的话,并且我在指南中看不到任何内容会阻止我的编辑。我绝对不能再做什么? – Borodin

回答

1

如果你想捕捉每行有提取IP “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

感谢您回复@stevieb工作良好,我可以应用于更多场景。 – abkrim

1

该图案获取IP不会忽略其后跟“SMTP认证失败”,并且如果发现匹配输出。 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