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/或</li> </ul> <H3>用 awk 一行命令完成统计与百分比计算</H3> <p>以下命令读取日志、分类计数、最后输出带百分比的表格:</p><div class="aritcle_card flexRow"> <div class="artcardd flexRow"> <a class="aritcle_card_img" href="/xiazai/skill6580" title="Linux installer"><img src="https://img.php.cn/upload/skill/000/000/081/179101817874041.jpg" alt="Linux installer" onerror="this.onerror='';this.src='/static/lhimages/moren/morentu.png'" ></a> <div class="aritcle_card_info flexColumn"> <a href="/xiazai/skill6580" title="Linux installer">Linux installer</a> <p>先解析安全源,运行本地CLI安装、启动、卸载Linux桌面应用。用户请求时使用。</p> </div> <a href="/xiazai/skill6580" title="Linux installer" class="aritcle_card_btn flexRow flexcenter"><b></b><span>下载</span> </a> </div> </div> <pre class='brush:php;toolbar:false;'>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 样本,调整正则确保覆盖你日志里的真实格式。不复杂但容易忽略细节 —— 浏览器识别顺序和排除条件,往往决定结果是否可信。
- 加 tolower(ua) 转小写再匹配,简化正则(如

















