awk 是比较强力的工具,跟cut和sed组合起来,会有意想不到的作用
举个简单例子,我们nginx的access.log如下:
1110.244.232.88 - - [12/Apr/2022:16:50:06 +0800] help.jjwxc.net "GET /user/article/248 HTTP/1.1" 200 10616 "http://my.jjwxc.net/"
2220.244.232.88 - - [12/Apr/2022:16:50:06 +0800] help.jjwxc.net "GET /user/article/248 HTTP/1.1" 200 20616 "http://my.jjwxc.net/"
3330.244.232.88 - - [12/Apr/2022:16:50:06 +0800] help.jjwxc.net "GET /user/article/248 HTTP/1.1" 200 30616 "http://my.jjwxc.net/"
4410.244.232.88 - - [12/Apr/2022:16:50:06 +0800] help.jjwxc.net "GET /user/article/248 HTTP/1.1" 200 10616 "http://my.jjwxc.net/"
5530.244.232.88 - - [12/Apr/2022:16:50:06 +0800] help.jjwxc.net "GET /user/article/248 HTTP/1.1" 200 10616 "http://my.jjwxc.net/"
6650.244.232.88 - - [12/Apr/2022:16:50:06 +0800] help.jjwxc.net "GET /user/article/248 HTTP/1.1" 200 50616 "http://my.jjwxc.net/"
7760.244.232.88 - - [12/Apr/2022:16:50:06 +0800] help.jjwxc.net "GET /user/article/248 HTTP/1.1" 200 60616 "http://my.jjwxc.net/"
第一个字段是ip,然后倒数第3个是200,表示200 OK,后面的就是传输了多少数据两给客户端 我们要统计一下流量大的前5名是谁。
思路如下: 我们需要造一个数组,然后数组的键值就是ip,然后值就是数据量,如果ip重复,那么就累加数据
1cat access.log | awk -F\" '{print $1 $3}'|cut -d' ' -f 1,9|sort -nrk 2| awk '{ip[$1] +=$2}END{for (i in ip) {print i, ip[i]}}' | sed -n '1,5p'
最后结果:
1160.244.232.88 60616
2220.244.232.88 20616
3330.244.232.88 41232
4450.244.232.88 50616
5510.244.232.88 21232
注意 10.244.232.88 和 30.244.232.88 后面的数据都是累加过的。