awk提取日志指定列数据需先确认分隔符和列位置,再用print输出;支持按列号、匹配模式或字段名动态定位,并可结合sort、uniq等进行统计去重。

用 awk 提取日志中指定列的访问数据,核心是明确日志字段分隔符和目标列号(或匹配模式),然后用 print 输出所需内容。
确认日志字段分隔符和列位置
大多数 Web 日志(如 Nginx、Apache)默认用空格或制表符分隔,但有些用竖线(|)或逗号。先用 head -n 1 access.log 查看首行,再用 awk -F' ' '{print NF; print $1,$2,$3}' access.log | head -n 3 检查字段数和前几列内容。若字段含空格(如 URL 中有空格),需改用更稳妥的分隔符(如双引号包围的字段),此时建议配合 -F'"' 或正则分隔 -F'[[:space:]]+"'。
按列号提取固定位置的数据
例如 Nginx 日志中客户端 IP 通常是第 1 列,状态码是第 9 列,响应大小是第 10 列:
在无 root/sudo 权限的环境(云容器、VPS、隔离主机)中安装并配置 OpenClaw 浏览器工具的 headless Chrome。适用场景:...
- 提取所有客户端 IP:
awk '{print $1}' access.log - 提取状态码和响应字节数(第 9 和第 10 列):
awk '{print $9, $10}' access.log - 只输出状态码为 200 的请求的 IP 和 URL(假设 URL 在第 7 列):
awk '$9 == 200 {print $1, $7}' access.log
按字段名或关键词动态定位列
当日志格式不固定或列序可能变化时,可用 NR==1 扫描首行找列名。例如带 header 的 CSV 日志:
- 先获取“ip”列的序号:
awk -F, 'NR==1 {for(i=1;i1 {print $ip_col}' access.csv - 提取包含 “GET /api/” 的行的第 1、7、9 列:
awk '$7 ~ /^GET \/api\// {print $1, $7, $9}' access.log
统计与去重等常见后续处理
提取后常需汇总分析:
- 统计各 IP 访问次数:
awk '{print $1}' access.log | sort | uniq -c | sort -nr - 提取唯一 URL 并排序:
awk '{print $7}' access.log | sort -u - 过滤并格式化输出(如加时间戳):
awk '$9 >= 400 {printf "%s %s %s ", $1, $9, $4}' access.log($4 是时间字段)










