在现网应用中,尤其是web服务器上经常会遇到需要查看主机IP连接数的情况,而我常用的语句如下:

1# 统计所有
2netstat -an|awk '{if( $5 ~ /[1-255]/)print $5}' |awk -F: '{print $1}'|sort|uniq -c|sort -nr
3# 只统计ESTABLISHED状态的
4netstat -an|grep ESTAB|awk '{print $5}' |awk -F: '{print $1}'|sort|uniq -c|sort -nr

今天网上看到了另一个使用awk处理的脚本,号称速度更快。具体脚本如下:

 1# awk 'BEGIN{
 2    while("netstat -an"|getline){
 3        if( $5 ~ /[1-255]/)
 4        {
 5            split($5,t1,":");
 6            tarr[t1[1]]++;
 7        }
 8    }
 9    for(k in tarr)
10        {
11            print k,tarr[k] | "sort -r -n -k2";
12        }
13};'

$5是netstat –an 第5个字段。默认就是对方连接ip以及端口。

不过在现网处理中,我分别使用上面我常用的语句和网上看到的语句通过time统计对比,并未发现比我使用的快。对比方法如下:

1# time awk 'BEGIN{while("netstat -an"|getline){if( $5 ~ /[1-255]/){split($5,t1,":");tarr[t1[1]]++;}}for(k in tarr){print k,tarr[k] | "sort -r -n -k2";}};'
2# time netstat -an|awk '{if( $5 ~ /[1-255]/)print $5}' |awk -F: '{print $1}'|sort|uniq -c|sort -nr

细想一下也是,awk内部也调用了系统命令sort 。所以理论上来说两者并无不同。不过awk使用的娴熟度倒倒得借鉴学习。这里也记录下吧。