- 论坛徽章:
- 0
|
- 192.168.1.232 cc IEXPLORE.EXE:3:5.0 2003-12-17 08:38:09 S10 - 61.172.244.150 80 7953 284165 80 TCP Connect 20000 14008 880747
复制代码
这个是isa2000的w3c扩展日志.其中第11段和第12段为上传和下载的byte数.ok知道这些就可以统计下载的流量了.
不过我首先要抓一些倒霉鬼.
- tail -99000 FWSEXTD20031217.log |awk '{if ($12>0 && $11>1500)print $1}'|sort|uniq|less>uplist
复制代码
上面这个代码是说从日志文件末尾起弄99000个记录,然后通过管道到awk来处理,如果$12(下载)>0和$11(上传)>1500
把这些记录打印出来.并且用sort|uniq组合把重复的ip去掉.然后通过>符号导入到uplist这个文件中.
接着就可以来处理这个uplist文件了.
把下面的代码保存成search.sh
- #!/bin/sh
- for ip in `cat uplist`
- do
- cat FWSEXTD20031217.log |grep "$ip\b"|awk -v ip2="$ip" '{count+=$11}END{printf "%13s %15d\n",ip2,count}'
- done
复制代码
上面这个脚本执行一个循环(for循环).
for ip in `cat uplist`是把uplist的东西作为for的循环列表.
``是用来执行cat uplist,并且把这个结果作为一个数组变量.
grep "$ip\b"
$ip表示是从刚才那个数组变量$ip中取的的一个记录,\b表示一个单词的边界.
也就是说192.168.5.11只会匹配192.168.5.11而不会匹配192.168.5.111
然后管道|把结果传到awk来处理
-v表示允许用户的自定义变量参与到awk的运算中
这里用户的自定义变量ip2被赋值上$ip,也就是ip2变成了数组变量中的一个ip
接着再{}中的是awk的动作了.把$11(11列)累加.并赋值到一个自定义变量count中
END表示awk完成累加后的动作,用printf来打印规范的格式.
%s表示字符串,中间的13表示字符串的长度,
%d表示整数,15表示长度
\n表示回车
ip2对应第一个%s,
count对应第二个%d
这样这个脚本就ok了.
chmod 755 search.sh
./search >up.txt
同时为了排序可以用
sort -g -k2 up.txt>sort.up.txt
-k表示排序的参考列.2表示第二列.
这样最终的sort.up.txt就是最终的结果(节选).
- 192.168.5.113 336943666
- 192.168.5.115 416217456
- 192.168.5.104 1681544713
- 192.168.5.189 5.43456e+09
复制代码
104是1G多的byte
下面是一个查下载的脚本
- #!/bin/sh
- tail -99000 FWSEXTD20031217.log |awk '{if ($12>1500 && $11>0)print $1}'|sort|uniq|less>dllist
- for ip in `cat dllist`
- do
- cat FWSEXTD20031217.log |grep "$ip\b"|awk -v ip2="$ip" '{count+=$12}END{printf "%13s %15d\n",ip2,count}'>>dl.txt
- done
- sort -g -k2 dl.txt>sort.dl.txt
复制代码
这里有个疑问,我用grep过滤ip,有没有办法让awk来过滤ip?
我一直没找到awk怎么能实现过滤ip
也就是- awk -v ip2="$ip" '/ip2\y/{....}'
复制代码 ,这个始终不能有结果.
用- awk -v ip2="$ip" '$1 ~ ip2{.....}'
复制代码 又没法确定ip的边界,
192.168.5.11往往匹配192.168.5.111
 |
|