apache日志分析应先确认格式再选列:sed清洗行级内容,awk按列处理;ip统计用$1,状态码通常$9,时间在$4,需转义特殊字符,关联数组可高效统计频次。

直接用 awk 和 sed 配合管道处理 Apache 日志,效率远高于肉眼翻查或写脚本。关键不是记命令,而是理解日志结构、明确目标字段、选对工具分工:sed 负责清洗和提取行级模式,awk 负责按列切分、条件过滤与聚合统计。
提取访问次数最多的 IP 地址
Apache 访问日志中 IP 通常在每行开头(标准格式),但注意:若日志含反向代理(如 Nginx 做前置),真实 IP 可能在 X-Forwarded-For 字段里,此时需先用 sed 或 awk 提取该头。
默认格式下(如 192.168.1.100 - - [...] "GET..." 200 ...):
awk '{print $1}' access.log | sort | uniq -c | sort -nr | head -10
说明:$1 是第一列(IP),sort | uniq -c 统计频次,sort -nr 按数字倒序排,head -10 取前10。
快速筛选特定状态码的请求(如 500 错误)
状态码一般为第9列(标准 combined 格式),但列号可能因自定义 LogFormat 变动。先用 head -1 access.log | cut -d' ' -f1-12 粗略看前12列确认位置。
常用写法:
awk '$9 == 500 {print $1, $4, $7, $9, $10}' access.log
说明:只输出 IP、时间、URL、状态码、响应大小;$9 == 500 是精确匹配,若要查所有 5xx,可用 $9 ~ /^5/。
抽取某段时间内的日志(如今天 09:00–10:00)
Apache 日志时间字段形如 [15/Jan/2026:09:23:41 +0800],位于第4列。用 awk 直接匹配子串更稳:
awk '$4 ~ /\[15\/Jan\/2026:09:[0-5][0-9]/' access.log
说明:[ 转义左方括号,/ 转义斜杠,09:[0-5][0-9] 匹配 09:00 到 09:59;日期请按实际替换(如 $(date +%d/%b/%Y) 可动态插入)。
Zynq‑7000 / Zynq UltraScale+ 硬件调试技能。适用于 Xilinx Zynq(Cortex‑A9/A53 + FPGA)Linux 环境,调试 I2C、I2S、UART、GPIO 等外设。包括设备树配置、内核驱动、用户空间调试工具、交叉编译和常见问题排查,支持 PetaLinux 开发。
清洗并结构化输出(IP + 时间 + 方法 + URL + 状态码)
原始日志含大量干扰字符(如引号、方括号),sed 先做轻量清洗,再交由 awk 结构化:
sed -E 's/[([^]]+)]//g; s/"//g' access.log |
awk '{print $1, $4, $6, $7, $9}'
说明:sed 去掉时间外的 [ ] 和所有双引号,让字段对齐更可靠;$6 是 GET/POST,$7 是 URL 路径。
统计各响应状态码出现次数
一行搞定,无需临时文件:
awk '{count[$9]++} END {for (code in count) print code, count[code] | "sort -n"}' access.log
说明:用关联数组 count 累计每个状态码频次,END 块遍历输出,| "sort -n" 在 awk 内部调用系统排序,按数字升序排列。
不复杂但容易忽略:先用 head -3 access.log 确认日志格式,再决定 $N 是哪一列;有自定义 LogFormat 时,务必查 httpd.conf 或 apache2.conf 中的 LogFormat 行。










