用 awk 和 uniq 分析服务器访问日志的十条命令

站点跑在阿里云 ECS 上,偶尔要翻 access_log 确认访问量、看有没有人在扫后台。nginx 默认日志是空格分隔的文本,用 awk、sort、uniq、grep 几个命令组合就够,不需要额外装分析工具。下面这些是长期留在笔记里的一条条命令,log_file 换成实际路径(一般是 /var/log/nginx/access.log)。

访问量与来源统计

独立 IP 数:

awk '{print $1}' log_file|sort|uniq|wc -l

某一个页面被访问的次数:

grep "/index.php" log_file | wc -l

每个 IP 访问了多少个页面,结果落到 log.txt 再排:

awk '{++S[$1]} END {for (a in S) print a,S[a]}' log_file > log.txt
sort -n -t ' ' -k 2 log.txt 配合sort进一步排序

排序与 Top N

按访问页面数从小到大排(把计数放在第一列才能被 sort -n 识别):

awk '{++S[$1]} END {for (a in S) print S[a],a}' log_file | sort -n

取访问量前十的 IP。uniq -c 的作用是按行分组统计,并把计数写在最前面:

awk '{print $1}' |sort|uniq -c|sort -nr |head -10 access_log
cat access.log|awk '{print $1}'|sort|uniq -c|sort -nr|head -10

按 URL 统计访问次数:

cat access.log|awk '{counts[$(11)]+=1}; END {for(url in counts) print counts[url], url}

定位单个 IP 与时间窗口

某个 IP 访问了哪些页面,$1 是客户端 IP、$7 是请求路径:

grep ^111.111.111.111 log_file| awk '{print $1,$7}'

统计某个整点小时内有多少 IP 访问。时间格式是 nginx 日志里的 16/Aug/2015:14,换成自己要查的日期和小时:

awk '{print $4,$1}' log_file | grep 16/Aug/2015:14 | awk '{print $2}'| sort | uniq | wc -l

排除搜索引擎爬虫之后再看独立 IP 数,判断真实访客量:

awk '{print $12,$1}' log_file | grep ^"Mozilla | awk '{print $2}' |sort | uniq | wc -l

用之前要知道的几点

字段位置依赖日志格式:$1 是远程 IP、$4 是时间、$7 是请求、$12 是 Referer 这套默认格式,如果改过 log_format,序号要重新数。

前十 IP 那条命令单独执行会卡在标准输入,前面加 cat access.log| 才是能直接跑的形式。

日志切分之后单日文件仍在几百 MB 量级,sort|uniq 会吃内存,长期做统计建议先 gzip 再用 zcat 喂给管道,或者按天出报表。

© 版权声明
THE END
喜欢就支持一下吧
点赞12 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容