我希望从邮件日志中匹配(并计算它们的出现次数)所有非私有范围的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,这就是我需要的。
有知识的人?
答案 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