UNIT38 awk常见应用

.awk 查看ip连接数

处理文本,是awk的强项了。 无论性能已经速度都是让人惊叹!

$ 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 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";}};' 

211.151.33.14 28

113.65.21.200 14

121.32.89.106 13

60.191.178.230 12

118.133.177.104 12

58.61.152.154 11

 

real    0m1.149s

user    0m0.032s

sys     0m1.055s

 

awk常见应用系列,会一直更新!我会把这些年我在服务器管理方面一些代码总结归纳与朋友共同学习。

.awk实现实时监控网卡流量脚本

通过第3方工具获得网卡流量,这个大家一定很清楚。其实通过脚本一样可以实现效果。下面是我个人工作中整理的数据。以下是shell脚本统计网卡流量。

 

实现原理:

$ cat /proc/net/dev

Inter-|   Receive                                                |  Transmit

face |bytes    packets errs drop fifo frame compressed multicast|bytes    packets errs drop fifo colls carrier compressed

    lo:1068205690 1288942839    0    0    0     0          0         0 1068205690 1288942839    0    0    0     0       0          0

  eth0:91581844 334143895    0    0    0     0          0 145541676 4205113078 3435231517    0    0    0     0       0          0

proc/net/dev 文件保存了网卡总流量信息,通过间隔一段间隔,将入网卡与出记录加起来。减去之前就得到实际速率。

程序代码:

awk 'BEGIN{

OFMT="%.3f";

devf="/proc/net/dev";

while(("cat "devf) | getline)

{

    if($0 ~ /:/ && ($10+0) > 0)

    {

        split($1,tarr,":");

        net[tarr[1]]=$10+tarr[2];

        print tarr[1],$10+tarr[2];

    }

}

close(devf);

while((system("sleep 1 ")) >=0)

{

    system("clear");

    while( getline < devf )

    {

        if($0 ~ /:/ && ($10+0) > 0)

            {

                split($1,tarr,":");

                if(tarr[1] in net)

                {

                    print tarr[1],":",($10+tarr[2]-net[tarr[1]])*8/1024,"kb/s";

                    net[tarr[1]]=$10+tarr[2];

                }      

            }   

    }

    close(devf);

}

}'

说明:第一个while 是获得总的初始值,$1是网卡出流量,$10是网卡进流量。第2个while会间隔1秒钟启动一次。计算总流量差得到平均每秒流量。

 

注意:通过getline 逐行读取文件,需要close关闭 。否则在第2次while循环中不能获得数据。

.awk 分析web日志(页面执行时间)

前一段时间,我写过一篇文章,shell脚本分析 nginx日志访问次数最多及最耗时的页面(慢查询),其中提到了分析耗时页面重要性。今天主要讲的,是通过awk分析日志,快捷得到执行时间。在性能以及效率方面比前一篇提到的有很大提高!

1.web日志文件格式

222.83.181.42 - - [09/Oct/2010:04:04:03 +0800] GET /pages/international/tejia.php HTTP/1.1 "200" 15708 "-" "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; Sicent; WoShiHoney.B; .NET CLR 2.0.50727; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729)" "-" 0.037

按照空格分隔的话,最后一个字段[0.037] 是页面执行时间,第7个字段 是页面访问地址。

2.执行代码

awk 'BEGIN{

print "Enter log file:";

getline logs;

#logs="/var/log/nginx/access.log-20101008";

OFMT="%.3f";

 

while(getline < logs)

{

    split($7,atmp,"?");

    aListNum[atmp[1]]+=1;

    aListTime[atmp[1]]+=$NF;

    ilen++;

}

close(logs);

print "\r\ntotal:",ilen,"\r\n======================================\r\n";

for(k in aListNum)

{

    print k,aListNum[k],aListTime[k]/aListNum[k] | "sort -r -n -k3";

}

 

}'

42

2780条日志,统计完成速度是:5秒左右

.awk 多行合并【next 使用介绍】

在awk进行文本处理时候,我们可能会遇到。将多行合并到一行显示问题。 有点象sql里面,经常遇到的行转列的问题。这里需要用到next语句。

Awk next语句使用:在循环逐行匹配,如果遇到next,就会跳过当前行,直接忽略下面语句。而进行下一行匹配。

text.txt 内容是:

a

b

c

d

e

$ awk 'NR%2==1{next}{print NR,$0;}' text.txt    

2 b

4 d

当记录行号除以2余 1,就跳过当前行。下面的print NR,$0也不会执行。 下一行开始,程序有开始判断NR%2 值。这个时候记录行号是:2 ,就会执行下面语句块:'print NR,$0'

awk next使用实例:

要求:

文件:text.txt 格式:

httpd                  ok

tomcat                 ok

sendmail               ok

web02[192.168.2.101]

httpd                  ok

postfix               ok

web03[192.168.2.102]

mysqld                ok

httpd                 ok

需要通过awk将输出格式变成:

web01[192.168.2.100]:   httpd            ok

web01[192.168.2.100]:   tomcat           ok

web01[192.168.2.100]:   sendmail         ok

web02[192.168.2.101]:   httpd            ok

web02[192.168.2.101]:   postfix          ok

web03[192.168.2.102]:   mysqld           ok

web03[192.168.2.102]:   httpd            ok

 

分析:

分析发现需要将包含有“web”行进行跳过,然后需要将内容与下面行合并为一行。

$ awk '/^web/{T=$0;next;}{print T":\t"$0;}' test.txt

web01[192.168.2.100]:   httpd            ok

web01[192.168.2.100]:   tomcat           ok

web01[192.168.2.100]:   sendmail         ok

web02[192.168.2.101]:   httpd            ok

web02[192.168.2.101]:   postfix          ok

web03[192.168.2.102]:   mysqld            ok

web03[192.168.2.102]:   httpd            ok

next在多行合并,以及选择性输出方面,非常方便。大家在使用时候不妨试试。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值