awk - 如何排除私人ipaddress

时间:2015-12-18 03:20:55

标签: awk

使用netstat -ant结果

Proto Recv-Q Send-Q   Local Address         Foreign Address         State
tcp    0      0       192.168.200.14:80     192.168.200.14:12345    TIME_WAIT
tcp    0      0       192.168.200.14:80     53.54.56.56:54321       TIME_WAIT
tcp    0      0       ::1:80                ::1:25195               TIME_WAIT

我想仅从外部ip地址汇总TIME_WAIT连接数(不包括127.0.0.1,192.168.x.x,一些本地IP地址,ipv6)。

请帮助我使用awk命令,现在我正在使用:

netstat -nat |awk '/TIME_WAIT/&&/:80/' | wc -l

汇总端口80上的所有TIME_WAIT连接

netstat -nat |awk '/TIME_WAIT/&&/:80/{split($5,a,":");b[a[1] FS $6]++}END{for (i in b) print b[i],i}'

汇总每个IP地址80端口的TIME_WAIT连接。 非常感谢你。

2 个答案:

答案 0 :(得分:2)

您没有提供任何预期的输出,并且您的示例输入遗漏了很多,而且您的描述缺少很多重要信息,所以这是一个非常猜测但也许这就是您正在寻找或接近它:

$ cat tst.awk
BEGIN {
    targetPort = 80
    skipIps = "127.0.0.1 192.168.x.x"
    gsub(/[.]/,"[.]",skipIps)
    gsub(/x/,"[[:digit:]]+",skipIps)
    gsub(/ +/,"|",skipIps)
    skipIps = "^("skipIps")$"
}
{
    split($4,addr,/:/)
    localIp   = addr[1]
    localPort = addr[2]

    split($5,addr,/:/)
    foreignIp   = addr[1]
    foreignPort = addr[2]
}
(foreignIp !~ skipIps) (localPort == targetPort) && /TIME_WAIT/ { cnt++ }
END { print cnt }

$ awk -f tst.awk file
3

答案 1 :(得分:2)

你几乎就在那里

$ ... | awk '/TIME_WAIT/ 
           && $5 !~ /^127\.0\.0\.1/ 
           && $5 !~ /^192\.168/ {split($5,ip,":");
                                 a[ip[1]]++;
                                 sum++} 
                             END{for(k in a) 
                                    print k,a[k]; 
                                 print "============== ====";
                                 print "Total: ",sum}' | column -t