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