从实列中学习linux shell8 统计nginx中 访问量最多的前十个Ip,10G的日志文件也不怕,管道命令的精髓

统计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

关键点总结

  • 管道串联:每个命令专注单一任务,通过 | 传递数据,形成高效处理链
  • 排序依赖:首次 sortuniq -c 服务,二次 sort -nr 为结果排序
  • 性能优化:适合处理大文件,无需加载全部数据到内存

此脚本是 Linux 运维中 日志分析 的经典案例,常用于快速定位高频访问 IP(如排查 DDoS 攻击或热门资源访问)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一刀到底211

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值