📑 文章章节大纲 (点击平滑直达)
一、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