统计nginx中 访问量最多的前十个Ip
cat access.log | awk '{print $1}' | sort | uniq -c | sort -nr | head -10
下面是对该 Shell 脚本的逐层解析,最终目标是 统计访问日志中最高频的 10 个 IP 地址。通过管道组合多个命令,实现数据流的逐步加工:
完整命令
cat access.log | awk '{print $1}' | sort | uniq -c | sort -nr | head -10
分步解析
1. cat access.log
- 功能:输出
access.log
文件内容到标准输出(屏幕或管道) - 细节:若直接操作文件,可省略
cat
(如awk '{...}' access.log
),但此处通过管道传递更清晰
2. awk '{print $1}'
- 功能:提取每行的 第一列(默认以空格/Tab分隔)
- 场景:假设日志格式为
IP 时间 请求方法 URL ...
,这里提取的是客户端 IP 地址
示例输入行:192.168.1.1 [10/Oct/2023:14:32:01] "GET /index.html HTTP/1.1" 200
输出:192.168.1.1
3. sort
- 功能:对提取的 IP 列表 按字母顺序排序
- 必要性:为后续
uniq -c
统计做准备(uniq
依赖相邻重复项)
4. uniq -c
- 功能:统计 连续重复行出现的次数,并添加计数前缀
输入(排序后):
输出:192.168.1.1 192.168.1.1 192.168.1.2
2 192.168.1.1 1 192.168.1.2
5. sort -nr
- 功能:对统计结果二次排序
-n
:按 数值大小 排序(而非字母顺序)-r
:逆序排列(从大到小)
输入:
输出:2 192.168.1.1 5 192.168.1.3 1 192.168.1.2
5 192.168.1.3 2 192.168.1.1 1 192.168.1.2
6. head -10
- 功能:仅保留排序后的 前 10 行
输出:出现次数最多的前 10 个 IP 及其访问次数
完整数据流演示
假设 access.log
内容片段:
192.168.1.1 ...其他字段...
192.168.1.1 ...其他字段...
192.168.1.3 ...其他字段...
192.168.1.2 ...其他字段...
192.168.1.3 ...其他字段...
经过管道处理后的最终输出:
3 192.168.1.3
2 192.168.1.1
1 192.168.1.2
关键点总结
- 管道串联:每个命令专注单一任务,通过
|
传递数据,形成高效处理链 - 排序依赖:首次
sort
为uniq -c
服务,二次sort -nr
为结果排序 - 性能优化:适合处理大文件,无需加载全部数据到内存
此脚本是 Linux 运维中 日志分析 的经典案例,常用于快速定位高频访问 IP(如排查 DDoS 攻击或热门资源访问)。