如何使用awk匹配日志文件中的所有非私有范围IP地址?

时间:2014-07-24 15:30:27

标签: regex awk grep ip

我希望从邮件日志中匹配(并计算它们的出现次数)所有非私有范围的IP地址,而我却失败了。

据我所知:

  • 它应该匹配4x3数字模式,因为它是一个IP地址,不包括:
    • 10\.
    • 192\.168\.
    • 172\.1[6789]\.
    • 172\.2[0-9]\.
    • 172\.3[01]\.
    • 127\.0\.0\.1

[1]示例:postfix邮件日志行如下所示: CONNECT from [217.113.54.21]:56590 to [192.168.1.100]:25

而第一场比赛是有效的外部IP,这就是我需要的。

有知识的人?

2 个答案:

答案 0 :(得分:0)

这应该足以让你前进:

$ cat tst.awk
{
    while ( match($0,/\[([[:digit:]]{1,3}\.){3}[[:digit:]]{1,3}\]/) ) {
        ip = substr($0,RSTART+1,RLENGTH-2)
        $0 = substr($0,RSTART+RLENGTH)

        if ( ip ~ /^(\
10\.|\
192\.168\.|\
172\.1[6789]\.|\
172\.2[0-9]\.|\
172\.3[01]\.|\
127\.0\.0\.1)/ ) {
            invalid[ip]++
        }
        else {
            valid[ip]++
        }
    }
}

END {
    print "Valid IPs found:"
    for (ip in valid) {
        print "\t" ip, valid[ip]
    }

    print "\nInvalid IPs found:"
    for (ip in invalid) {
        print "\t" ip, invalid[ip]
    }
}

$ cat file
CONNECT from [217.113.54.21]:56590 to [192.168.1.100]:25
CONNECT from [217.113.54.21]:56590 to [192.168.2.99]:25

$ awk -f tst.awk file
Valid IPs found:
        217.113.54.21 2

Invalid IPs found:
        192.168.1.100 1
        192.168.2.99 1

如果您的问题中没有更多的样本输入和预期输出,那么我们现在无法帮助您。

答案 1 :(得分:0)

如果我理解正确的话。

awk 'match($3, /\[([0-9.]+)\]:[0-9]+/, arr){}; arr[1] !~ /^(192.168|10|172.16|127).[.0-9]+/ {print arr[1]}' file