awk 与shell 查看ip连接数

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



<br />
# 统计所有
netstat -an|awk '{if( 5 ~ /[1-255]/)print5}' |awk -F: '{print 1}'|sort|uniq -c|sort -nr
# 只统计ESTABLISHED状态的
netstat -an|grep ESTAB|awk '{print5}' |awk -F: '{print $1}'|sort|uniq -c|sort -nr
今天网上看到了另一个使用awk处理的脚本,号称速度更快。具体脚本如下:



<br />
# 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";
        }
};'
$5是netstat –an 第5个字段。默认就是对方连接ip以及端口。



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



<br />
# 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";}};'
# time netstat -an|awk '{if( 5 ~ /[1-255]/)print5}' |awk -F: '{print $1}'|sort|uniq -c|sort -nr
细想一下也是,awk内部也调用了系统命令sort 。所以理论上来说两者并无不同。不过awk使用的娴熟度倒倒得借鉴学习。这里也记录下吧。

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注