用awk统计日志中各API接口调用量,需先定位URL路径字段(如Nginx日志中第7列或引号内请求行),用sub()去除查询参数,再以路径为键计数,支持按方法+路径联合统计,并通过正则过滤非法路径提升健壮性。

用 awk 统计日志中各 API 接口的调用量,核心是提取接口路径(如 /api/v1/users、/login),然后按路径计数。关键在于准确识别和截取 URL 路径字段,避免误匹配或漏统计。
确认日志格式并定位 URL 字段
大多数 Web 日志(如 Nginx、Apache 或应用自定义日志)中,请求路径通常出现在固定位置。例如 Nginx 的默认日志格式:
192.168.1.100 - - [10/Jan/2024:14:22:03 +0800] "GET /api/v1/orders?status=paid HTTP/1.1" 200 1234其中 "GET /api/v1/orders?status=paid HTTP/1.1" 是请求行,路径部分为 /api/v1/orders(问号及之后为查询参数,一般不参与接口归类)。
- 先用
head -5 your.log查看前几行,确认请求路径所在字段(通常是第7个字段,但需验证) - 若日志用空格分隔,且路径在第7列,可用
$7直接取值;若含引号或特殊分隔符(如 JSON 日志),需配合gsub()清洗 - 对 JSON 日志(如
{"method":"GET","path":"/api/v2/profile","status":200}),建议先用jq提取 path,再交给awk计数,或在awk中用正则匹配"path":"([^"]*)"
基础统计:提取路径并去参计数
假设路径在第7列且带查询参数,用 sub() 去掉 ? 及之后内容,再累计计数:
awk '{sub(/\?.*/, "", $7); count[$7]++} END {for (path in count) print count[path], path}' access.log | sort -nr-
sub(/\?.*/, "", $7)将第7字段中第一个?及其后全部删掉,保留干净路径 -
count[$7]++以路径为 key 累加次数 -
END块遍历数组并输出,sort -nr按数值逆序排列(最多调用排最前)
增强健壮性:处理引号、多空格与异常行
实际日志常含引号、连续空格或缺失字段。更稳妥写法:
awk -F'"' 'NF>=2 {path=$2; sub(/^[[:space:]]+|[[:space:]]+$/, "", path); sub(/\?.*/, "", path); if (path ~ /^\/[a-zA-Z0-9_\/]+$/) count[path]++} END {for (p in count) print count[p], p}' access.log | sort -nr-
-F'"'以双引号为分隔符,请求行通常被包裹在引号中,$2 即为完整请求字符串(如GET /api/login HTTP/1.1) -
sub(/^[[:space:]]+|[[:space:]]+$/, "", path)去首尾空格 -
if (path ~ /^\/[a-zA-Z0-9_\/]+$/)过滤掉非标准路径(如空值、非法字符),避免噪声干扰
按方法 + 路径联合统计(区分 GET/POST 等)
若需区分不同 HTTP 方法(如 POST /api/v1/users 和 GET /api/v1/users 视为不同接口):
awk -F'"' 'NF>=2 {req=$2; match(req, /(GET|POST|PUT|DELETE)[[:space:]]+([^[:space:]]+)/, m); if (m[2]) {path=m[2]; sub(/\?.*/, "", path); key=m[1] " " path; count[key]++}} END {for (k in count) print count[k], k}' access.log | sort -nr-
match(..., m)提取方法名和路径到数组m,m[1]是方法,m[2]是路径 -
key=m[1] " " path构建复合键,实现方法+路径联合统计 - 该写法兼容多种方法,且自动跳过匹配失败的异常行


















