高级技巧之日志分析:利用 Linux 指令分析 Web 日志
0. 引言
著名的黑客、自由软件运动的先驱理查德·斯托曼说过:"编程不是科学,编程是手艺。"掌握 Log 分析,就是运维与开发最实用的手艺之一。本章结合真实工作场景:用一条 5 万多条记录的 Nginx 访问日志(可自 GitHub 下载),从环境评估、格式预览到 PV/UV 统计,完整走一遍"用 Linux 指令分析 Web 日志"的流程,掌握 wc、awk、sort、uniq 的组合用法。
1. 分析前准备:能不能这样做?
分析线上日志前,先评估机器负载,避免分析动作本身拖垮生产:
- 用
htop查看 CPU 与内存负载(未安装可用yum install htop或apt install htop); - 用
wget下载日志文件到本地,ls -lh --block-size=M查看大小; - 大文件先
scp到闲置服务器再分析,绝不在生产核心机上直接跑重分析。
htop # 检查当前负载
wget <日志下载地址> # 下载示例 access.log(约 7M)
ls -lh --block-size=M access.log
原则:先看资源,再动手。7M 的日志对线上影响可忽略,GB 级日志必须转移战场。
2. 预览格式:less 而不是 cat
分析前先用 less 查看日志内容——线上执行 cat 是危险操作,可能瞬间打满终端与内存:
less access.logNginx 的 access_log 每一行就是一次用户访问,从左到右依次是:
| 字段 | 含义 |
|---|---|
| 第 1 列 | 客户端 IP 地址 |
| 第 4 列 | 访问时间(含时区) |
| 第 5~7 列 | HTTP 请求方法、路径、协议版本 |
| 第 9 列 | 返回状态码 |
| 末尾 | User-Agent 等信息 |
记住列位置很重要:awk 的 $1、$4 就是从这里来的。
3. PV 分析:wc -l 一行搞定
PV(Page View)即页面访问量。对 Nginx 日志而言,行数就是 PV:
wc -l access.log
# 示例输出:51462本例日志共 51462 条访问记录——这就是总 PV。
4. 按天分组 PV:awk + sort + uniq
日志可能跨多天,按天聚合才能看出趋势。分三步走:
第一步:定位时间列
awk '{print $4}' access.log | less$4 是第 4 列(时间),awk 是处理文本的领域专用语言(DSL),专为"按列切分、逐行处理"设计。
第二步:截取日期
awk '{print substr($4, 2, 11)}' access.log | less
# substr($4, 2, 11):从第 2 个字符起截 11 个字符,如 "17/May/2015"第三步:分组统计
awk '{print substr($4, 2, 11)}' access.log | sort | uniq -c
sort 排序 → uniq -c 统计相邻相同行数,得到每天的 PV 量(本例约每天 2000~3000 条,横跨 5 月 17 日至 6 月 4 日)。
5. UV 分析:IP 去重
UV(Unique Visitor)即独立访客数。准确识别用户身份很复杂,用 IP 近似 UV 是标准做法:
awk '{print $1}' access.log | sort | uniq | wc -l
# 示例输出:2660(即 2660 个独立 IP)管道语义:$1 取 IP → sort 排序 → uniq 去重 → wc -l 计数。
6. 按天分组 UV:awk 脚本实战
按天统计 UV 需要"日期 + IP"组合去重,用脚本串联多步:
#!/usr/bin/bash
awk '{print substr($4, 2, 11) " " $1}' access.log |\
sort | uniq |\
awk '{uv[$1]++; next} END {for (ip in uv) print ip, uv[ip]}'逐步拆解:
| 步骤 | 命令 | 作用 |
|---|---|---|
| 1 | 第一次 awk | 把日期与 IP 拼接成一行两列 |
| 2 | sort | 字典序排序(先日期后 IP) |
| 3 | uniq | 同日同 IP 只保留一行 |
| 4 | 第二次 awk | 按第一列日期累加计数,END 块在全部行处理完后输出 |
保存为 sum.sh 后执行:
chmod +x ./sum.sh
./sum.sh输出即每天的独立访客数。这套"取列 → 排序 → 去重 → 计数"的组合拳,可以迁移到应用日志、前端日志、监控日志等任何文本日志分析中。
7. 小结
- 分析前:先看负载(htop)、大文件转移战场(scp),线上绝不
cat大文件; - PV:
wc -l一行;UV:awk|sort|uniq|wc -l四步; - 分组统计:
awk substr截日期 +sort|uniq -c聚合,复杂场景用 awk 脚本接管道; - 思考题:① 分析日志中有哪些终端访问(按 User-Agent 分组);② 找出访问量 Top 3 的网页(按路径列分组计数)。
下一章讲解集群部署实战——利用 Linux 指令在多台机器上批量部署程序。