{T}

高级技巧之日志分析:利用 Linux 指令分析 Web 日志

0. 引言

著名的黑客、自由软件运动的先驱理查德·斯托曼说过:"编程不是科学,编程是手艺。"掌握 Log 分析,就是运维与开发最实用的手艺之一。本章结合真实工作场景:用一条 5 万多条记录的 Nginx 访问日志(可自 GitHub 下载),从环境评估、格式预览到 PV/UV 统计,完整走一遍"用 Linux 指令分析 Web 日志"的流程,掌握 wcawksortuniq 的组合用法。


1. 分析前准备:能不能这样做?

分析线上日志前,先评估机器负载,避免分析动作本身拖垮生产:

  • htop 查看 CPU 与内存负载(未安装可用 yum install htopapt install htop);
  • wget 下载日志文件到本地,ls -lh --block-size=M 查看大小;
  • 大文件先 scp 到闲置服务器再分析,绝不在生产核心机上直接跑重分析。
bash
htop                          # 检查当前负载
wget <日志下载地址>            # 下载示例 access.log(约 7M)
ls -lh --block-size=M access.log

![负载检查与文件大小](/os-images/12-高级技巧之日志分析:利用 Linux 指令分析 Web 日志__CgqCHl-BkJ6AcP32AAduMy8fcSw412.png)

原则:先看资源,再动手。7M 的日志对线上影响可忽略,GB 级日志必须转移战场。


2. 预览格式:less 而不是 cat

分析前先用 less 查看日志内容——线上执行 cat 是危险操作,可能瞬间打满终端与内存:

bash
less access.log

Nginx 的 access_log 每一行就是一次用户访问,从左到右依次是:

字段含义
第 1 列客户端 IP 地址
第 4 列访问时间(含时区)
第 5~7 列HTTP 请求方法、路径、协议版本
第 9 列返回状态码
末尾User-Agent 等信息

记住列位置很重要:awk$1$4 就是从这里来的。


3. PV 分析:wc -l 一行搞定

PV(Page View)即页面访问量。对 Nginx 日志而言,行数就是 PV

bash
wc -l access.log
# 示例输出:51462

本例日志共 51462 条访问记录——这就是总 PV。


4. 按天分组 PV:awk + sort + uniq

日志可能跨多天,按天聚合才能看出趋势。分三步走:

第一步:定位时间列

bash
awk '{print $4}' access.log | less

$4 是第 4 列(时间),awk 是处理文本的领域专用语言(DSL),专为"按列切分、逐行处理"设计。

第二步:截取日期

bash
awk '{print substr($4, 2, 11)}' access.log | less
# substr($4, 2, 11):从第 2 个字符起截 11 个字符,如 "17/May/2015"

第三步:分组统计

bash
awk '{print substr($4, 2, 11)}' access.log | sort | uniq -c

![按天分组统计结果](/os-images/12-高级技巧之日志分析:利用 Linux 指令分析 Web 日志__CgqCHl-BkNGAB-VgAASNmct9nQA628.png)

sort 排序 → uniq -c 统计相邻相同行数,得到每天的 PV 量(本例约每天 2000~3000 条,横跨 5 月 17 日至 6 月 4 日)。


5. UV 分析:IP 去重

UV(Unique Visitor)即独立访客数。准确识别用户身份很复杂,用 IP 近似 UV 是标准做法:

bash
awk '{print $1}' access.log | sort | uniq | wc -l
# 示例输出:2660(即 2660 个独立 IP)

管道语义:$1 取 IP → sort 排序 → uniq 去重 → wc -l 计数。

图表渲染中…

6. 按天分组 UV:awk 脚本实战

按天统计 UV 需要"日期 + IP"组合去重,用脚本串联多步:

bash
#!/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 拼接成一行两列
2sort字典序排序(先日期后 IP)
3uniq同日同 IP 只保留一行
4第二次 awk按第一列日期累加计数,END 块在全部行处理完后输出

保存为 sum.sh 后执行:

bash
chmod +x ./sum.sh
./sum.sh

输出即每天的独立访客数。这套"取列 → 排序 → 去重 → 计数"的组合拳,可以迁移到应用日志、前端日志、监控日志等任何文本日志分析中。


7. 小结

  • 分析前:先看负载(htop)、大文件转移战场(scp),线上绝不 cat 大文件;
  • PVwc -l 一行;UVawk|sort|uniq|wc -l 四步;
  • 分组统计awk substr 截日期 + sort|uniq -c 聚合,复杂场景用 awk 脚本接管道;
  • 思考题:① 分析日志中有哪些终端访问(按 User-Agent 分组);② 找出访问量 Top 3 的网页(按路径列分组计数)。

下一章讲解集群部署实战——利用 Linux 指令在多台机器上批量部署程序。