开发脚本,在端口 33001 上接收来自本地主机的数据,并查找请求不同 API 版本的次数并将其打印在屏幕上。
示例日志是:
172.32.11.121 736443 /api/2.3
98.134.54.184 182294 /api/2.3
172.32.11.121 736443 /api/2.3/security
203.44.122.18 397832 /api/3.0
172.32.11.121 736443 /api/2.3
98.134.54.184 182294 /api/3.0
172.32.11.121 736443 /api/2.3/logging
172.32.11.121 736443 /api/2.3
71.11.139.205 291187 /api/2.3
172.32.11.121 736443 /api/3.0/security
98.134.54.184 182294 /api/2.3
71.11.139.205 397832 /api/3.0/logging
第一个字段是 IP 地址,第二个字段是用户 ID,最后一个字段是资源路径。
答案1
假设文件中的数据indata
:
$ awk '{ ++c[$NF] } END { for (i in c) print c[i], i }' indata
1 /api/2.3/logging
1 /api/3.0/security
6 /api/2.3
2 /api/3.0
1 /api/3.0/logging
1 /api/2.3/security
该awk
脚本跟踪最后一列中的数据显示的次数,并在最后打印此信息的摘要。
仅获取版本数字,使用-F '/'
并替换$NF
为$3
。
或者:
$ cut -d ' ' -f 3 indata | sort | uniq -c
6 /api/2.3
1 /api/2.3/logging
1 /api/2.3/security
2 /api/3.0
1 /api/3.0/logging
1 /api/3.0/security
这会从数据中删除第三个空格分隔列并对其进行排序。uniq -c
然后计算每个唯一条目出现的次数。
要仅获取此变体的版本号,请在调用中替换-d ' '
为。-d '/'
cut
答案2
假设您只关心版本而不关心整个路径:
$ awk -F/ '{count[$3]++} END {for (v in count) print v, count[v]}' file
2.3 8
3.0 4
拆分 上的字段/
,版本号似乎是所有行中的第三个字段。