先看下待处理的文件内容:
[root@server2 ~]# netstat -ntu
Active Internet connections (w/o servers)
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 0 127.0.0.1:8652 127.0.0.1:40193 TIME_WAIT
tcp 0 0 127.0.0.1:8652 127.0.0.1:40192 TIME_WAIT
tcp 0 0 127.0.0.1:8652 127.0.0.1:40196 TIME_WAIT
tcp 0 0 127.0.0.1:8652 127.0.0.1:40199 TIME_WAIT
tcp 0 0 127.0.0.1:8652 127.0.0.1:40201 TIME_WAIT
tcp 0 0 127.0.0.1:8652 127.0.0.1:40204 TIME_WAIT
tcp 0 0 127.0.0.1:8652 127.0.0.1:40207 TIME_WAIT
tcp 0 0 127.0.0.1:8652 127.0.0.1:40210 TIME_WAIT
tcp 0 0 192.168.32.62:41682 192.168.47.207:5432 TIME_WAIT
tcp 0 0 192.168.32.62:41685 192.168.47.207:5432 TIME_WAIT
# netstat -ntu | tail -n +3 | awk '{ print $5}' | cut -d : -f 1 | sort | uniq -c| sort -n -r | head -n 5
tail -n +3 :去掉上面用红色标明的两行。
awk '{ print $5}':取数据的低5域(第5列),上面蓝色标明。
cut -d : -f 1 :取蓝色部分前面的IP部分。
sort:对IP部分进行排序。
uniq -c:打印每一重复行出现的次数。(并去掉重复行)
sort -n -r:按照重复行出现的次序倒序排列。
head -n 5:取排在前5位的IP 。
[root@server2 ~]# netstat -ntu | tail -n +3|awk '{ print $5}' | cut -d : -f 1 | sort | uniq -c| sort -n -r | head -n 5
8 127.0.0.1
2 192.168.47.207
得到了我们需要的结果。
附:统计一天内访问Apache的IP数
首先,了解下Apache的log记录形式,如下:
61.135.249.180 - - [22/Mar/2009:04:19:17 +0800] "GET /news_in.php?fid=233& tid=4763 HTTP/1.1" 200 7865 "-" "Mozilla/5.0 Firefox/3.0.5"
第一项为客户端的IP,第二项为访问时间,后面还请求的具体动作,浏览器类型等。我们关心的就是一条记录的第一项,我们知道,客户端每发起一次HTTP请求Apache就会生成如上的一条记录,那么我们自统计的时候就需要注意除掉重复的IP。
用shell实现如下,涉及到awk,sort,unip等工具。
用awk打印每行的第一项。
awk '{print $1}' access_log
用sort排序,方便后面去掉重的IP。
awk '{print $1}' access_log | sort
用uniq去掉重复IP的。
awk '{print $1}' access_log | sort | uniq
然后就可以用wc统计了。
awk '{print $1}' access_log | sort | uniq | wc
简单来说就是一些UNIX工具的结合。
[root@web httpd]# awk '{print $1}' access_log | sort | uniq | wc
764 764 10982
(责任编辑:IT) |