全部博文(298)
分类: Python/Ruby
2012-02-19 16:39:37
shell awk实现定时监控网卡流量脚本
实现原理:
root@gongzhi-virtual-machine:~# 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: 126000 2100 0 0 0 0 0 0 #126000 2100 0 0 0 0 0 0
eth0: 1302358 5520 0 0 0 0 0 0 #1466920 4007 0 0 0 0 0 0
root@gongzhi-virtual-machine:~#
通过利用文件/proc/net/dev可以知道网卡流量发送和接收的总量,每隔一秒统计发送总量来判断网速。
脚本清单:
#! /bin/bash
#$2为进流量 $10为出流量
awk 'BEGIN{
OFMT="%.3f";
devf="/proc/net/dev";
while(("cat "devf) | getline)
{
#$0 ~ /:/ 匹配到“:”的行 !~为不匹配
#$10为发送的字节数 ($10+0)转换为整数
if($0 ~ /:/ && ($10+0) > 0)
{
#以“:”为分割符,存储到tarr数组里面
#$1 lo:
#split($1,tarr,":");
#tarr[1]为lo ;tarr[1...]为空
#print tarr[1],tarr[2],tarr[3]
#net[“lo”]=$10+tarr[2]; 发送的数据+0
net[$1]=$10+$2;
print $1,$10+$2;
}
}
close(devf);
while((system("sleep 1 ")) >=0)
{
system("clear");
while( getline < devf )
{
if($0 ~ /:/ && ($10+0) > 0)
{
# split($1,tarr,":");
if($1 in net)
{
print $1,($10+$2-net[$1])*8/1024,"kb/s";
net[$1]=$10+$2;
}
}
}
close(devf);
}
}'
注意:通过getline 逐行读取文件,需要close关闭 。否则在第2次while循环中不能获得数据。