【Nginx】- AWK命令快速分析日志【访问最多请求最多的ip、最频繁、恶意访问】

admin / Nginx / / 350 字 · 约 3 分钟 / 3074 次阅读 /

一、Awk 数组基础概念

在 Awk 中,数组全为关联数组(Associative Array),下标不仅可以是数字,也可以是任意字符串(即键值对 Key-Value)。

  • 语法结构array[key] = value
  • 频次累计惯用法a[$1]++
    以第一列的内容作为 Key,每遇到相同记录时计数加 1。元素初始值默认为 0,因此可天然用于去重与频次统计。

二、Nginx 常用访问日志分析实战

假设标准 Nginx 日志格式如下:

$remote_addr - $remote_user [$time_local] "$request" $status $body_bytes_sent "$http_referer" "$http_user_agent" "$http_x_forwarded_for"

1. 统计访问频次最高的 10 个 IP

# 方法 1:Awk 数组内部累加
awk '{a[$1]++} END {for(i in a) print a[i], i | "sort -k1 -nr | head -n10"}' access.log

# 方法 2:管道 sort + uniq
awk '{print $1}' access.log | sort | uniq -c | sort -k1 -nr | head -n10

2. 统计访问量大于 100 次的异常 IP

awk '{a[$1]++} END {for(i in a) {if(a[i] > 100) print i, a[i]}}' access.log

3. 统计访问最多的前 10 个 URL($request)

awk '{a[$7]++} END {for(i in a) print a[i], i | "sort -k1 -nr | head -n10"}' access.log

4. 统计每个 URL 消耗的总带宽流量

awk '{size[$7] += $10} END {for(i in size) print size[i], i | "sort -k1 -nr | head -n10"}' access.log

5. 统计各类 HTTP 响应状态码分布

awk '{status[$9]++} END {for(s in status) print s, status[s]}' access.log

6. 统计产生 404 状态码最多的 IP

awk '$9 == "404" {a[$1]++} END {for(ip in a) print a[ip], ip | "sort -k1 -nr | head -n10"}' access.log
admin

admin

云原生架构 · 全栈开发

感谢阅读本文!记录系统架构思考与实战复盘。专注于 Python、Django、PostgreSQL 与云原生容器化工程实践。