awk可统计日志中浏览器访问比例:先用-f'"'提取user-agent字段,再按chrome/、edg/、edge/、firefox/、safari/、trident/优先级匹配归类,最后计数并计算百分比。

用 awk 统计日志中不同浏览器的访问比例,核心是:提取 User-Agent 字段 → 识别浏览器名称 → 计数 → 计算百分比。关键在于准确匹配常见浏览器标识,避免误判(比如 Chrome 和 Chromium、Edge 和 IE 混淆)。
提取并粗筛 User-Agent 字段
大多数 Web 日志(如 Nginx、Apache)中,User-Agent 通常在第 12 或第 14 列(取决于日志格式),可用 $0 ~ /"Mozilla\// 先过滤含浏览器标识的行,再用正则提取关键片段:
- Nginx 默认 combined 日志:User-Agent 在最后一个字段,可用 awk -F'\"' '{print $6}' 提取(双引号分隔)
- 更稳妥方式:awk -F'"' 'NF>=6 {ua=$6; if(ua ~ /Mozilla\//) print ua}' access.log
识别主流浏览器并归类统计
User-Agent 字符串冗长且变体多,需按优先级匹配(例如先匹配 Chrome,再匹配 Safari,避免 Chrome 被误判为 Safari):
-
Chrome:匹配
Chrome/[0-9]且不包含Edg/或Opr/ -
Safari:匹配
Safari/[0-9]且不含Chrome/ -
Firefox:匹配
Firefox/[0-9] -
Edge:匹配
Edg/[0-9](新版)或Edge/[0-9](旧版) -
IE:匹配
Trident/或
用 awk 一行命令完成统计与百分比计算
以下命令读取日志、分类计数、最后输出带百分比的表格:
awk -F'"' 'NF>=6 {
ua = $6
if (ua ~ /Edg\/[0-9]/) {b["Edge"]++}
else if (ua ~ /Chrome\/[0-9]/ && ua !~ /Edg\/|Opr\//) {b["Chrome"]++}
else if (ua ~ /Firefox\/[0-9]/) {b["Firefox"]++}
else if (ua ~ /Safari\/[0-9]/ && ua !~ /Chrome\//) {b["Safari"]++}
else if (ua ~ /Trident\/|MSIE [0-9]/) {b["IE"]++}
else {b["Other"]++}
total++
}
END {
for (i in b) {
printf "%-8s: %d (%.2f%%)\n", i, b[i], b[i]/total*100
}
}' access.log | sort -k3nr
说明:用关联数组 b[] 记录各浏览器次数,total 累计总有效条目;sort -k3nr 按百分比倒序排列。
补充建议:处理大小写与空格干扰
User-Agent 可能含大小写混杂或多余空格,可在匹配前统一处理:
- 加 tolower(ua) 转小写再匹配,简化正则(如
tolower(ua) ~ /chrome\/[0-9]/) - 用 gsub(/^ +| +$/, "", ua) 清理首尾空格
- 若日志中存在大量爬虫(如 curl、wget),可提前排除:ua !~ /curl|wget|python-requests|Go-http-client/
实际使用时,先用 head -20 查几条 User-Agent 样本,调整正则确保覆盖你日志里的真实格式。不复杂但容易忽略细节 —— 浏览器识别顺序和排除条件,往往决定结果是否可信。











