处理文本,是awk的强项了。 无论性能已经速度都是让人惊叹!
[chengmo@localhost ~]$ 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以及端口。
[chengmo@localhost ~]$ 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
real 0m1.149s
user 0m0.032s
sys 0m1.055s
查询访问最频繁的IP
awk '{print $1}' access-2020-04-06.log | sort | uniq -c | sort -n -k 1 -r | more
其他需求
如根据访问IP统计UV
awk '{print $1}' access-2020-04-06.log | sort | uniq -c | wc -l
cat netstat.txt
Proto Recv-Q Send-Q Local-Address Foreign-Address State
tcp 0 0 0.0.0.0:3306 0.0.0.0:* LISTEN
tcp 1 1 0.0.0.0:80 0.0.0.0:* LISTEN
tcp 0 0 127.0.0.1:9000 0.0.0.0:* LISTEN
tcp 0 0 yuedu.com:80 124.205.5.146:18245 TIME_WAIT
tcp 0 0 yuedu.com:80 61.140.101.185:37538 FIN_WAIT2
tcp 0 0 yuedu.com:80 110.194.134.189:1032 ESTABLISHED
tcp 0 0 yuedu.com:80 123.169.124.111:49809 ESTABLISHED
tcp 0 0 yuedu.com:80 116.234.127.77:11502 FIN_WAIT2
tcp 0 0 yuedu.com:80 123.169.124.111:49829 ESTABLISHED
tcp 0 0 yuedu.com:80 183.60.215.36:36970 TIME_WAIT
tcp 0 4166 yuedu.com:80 61.148.242.38:30901 ESTABLISHED
tcp 0 1 yuedu.com:80 124.152.181.209:26825 FIN_WAIT1
tcp 0 0 yuedu.com:80 110.194.134.189:4796 ESTABLISHED
tcp 0 0 yuedu.com:80 183.60.212.163:51082 TIME_WAIT
tcp 0 1 yuedu.com:80 208.115.113.92:50601 LAST_ACK
tcp 0 0 yuedu.com:80 123.169.124.111:49840 ESTABLISHED
tcp 0 0 yuedu.com:80 117.136.20.85:50025 FIN_WAIT2
tcp 0 0 :::22 :::* LISTEN
上小菜(基础条件匹配):
查询所有tcp中,接受队列非0的网络包。
$ awk '$1 =="tcp" && $2 > 0' netstat.txt
tcp 1 1 0.0.0.0:80 0.0.0.0:* LISTEN
打印出来的内容,我们不知所云。如果把第一行打出来,就一目了然了。这时候我们要用到awk的全局常量(如果想知道AWK的全局常量,我们可以往下看,附录,我把常用的罗列出来了)NR。
$ awk 'NR==1 || $1 =="tcp" && $2 > 0' netstat.txt
Proto Recv-Q Send-Q Local-Address Foreign-Address State
tcp 1 1 0.0.0.0:80 0.0.0.0:* LISTEN