Awk的用法

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 后面的数据都是累加过的。


Ansible之等待服务状态变成成功
Systemd与journalctl的双剑合璧
comments powered by Disqus