从日志里把答案抠出来
目标
练习把针对日志文件的问题转化为命令。/opt/lab/data/app.log 采用 IP 날짜 메서드 경로 상태코드 [ERROR] 格式,共 480 行。
为什么重要
发生故障时,真正需要的不是日志查看器,而是把问题转化成管道的能力。‘什么出现得最多’这类问题,几乎总能用 sort | uniq -c | sort -rn | head 这一固定模式回答。uniq -c 只能统计相邻的重复项,因此前面的 sort 必不可少;管道连接的各条命令在独立进程中同时流式处理,所以即使是巨大文件,也不必整体载入内存。这两点正是该模式速度快的原因。
步骤
- 统计包含
ERROR的行数,只把数字写入/root/error_count.txt。 - 把出现次数最多的一个 IP 写入
/root/top_ip.txt。 - 仅将状态码为
500的整行原样保存到/root/five_hundreds.txt。 - 把出现过的唯一不同路径(第 4 个字段)逐行保存到
/root/paths.txt。 - 按
코드 개수格式统计各状态码数量,以代码升序排列 3 行,保存到/root/status_counts.txt。 - 把请求数最多的 3 个路径按
경로 개수格式、数量降序排列 3 行,保存到/root/top3_paths.txt。 - 计算非 200 响应的比例,保留一位小数且不带 % 符号,写入
/root/error_rate.txt。 - 在
/root/report.txt中按以下顺序创建三行。total=<전체 줄 수>errors=<200 이 아닌 줄 수>top_path=<가장 많이 요청된 경로>
提示
- 使用
awk '{print $4}' 파일可以只提取第 4 个字段。 - 比例可像
awk '{t++; if ($5 != 200) e++} END {printf "%.1f\n", e*100/t}'一样在 END 块中计算。 - 常见错误 1:在
uniq -c前漏掉sort,就只会统计相邻项,结果会完全错误。 - 常见错误 2:第 3 步使用
grep 500,会连 IP 或其他字段中包含 500 的行也匹配。请指定字段。
统计 ERROR 行数
统计包含 ERROR 的行数,只把数字写入 /root/error_count.txt。
用管道连接筛选工具和计数工具。grep 也有只统计数量的选项。
请求次数最多的 IP
把出现次数最多的一个 IP 写入 /root/top_ip.txt。
提取第一个字段,再依次连接 sort | uniq -c | sort -rn。uniq -c 只能统计相邻的重复项。
仅提取 500 响应
仅将状态码为 500 的整行原样保存到 /root/five_hundreds.txt。
状态码是第 5 个字段。如果只用 grep 匹配字符串,其他字段中包含 500 的行也可能被选中。
唯一不同路径列表
把出现过的唯一不同路径(第 4 个字段)逐行保存到 /root/paths.txt。
路径是第 4 个字段。sort 本身就有去重选项。
按状态码汇总
按 코드 개수 格式统计各状态码数量,以代码升序排列 3 行,保存到 /root/status_counts.txt。
以‘代码 数量’格式按代码升序输出 3 行。可以使用 awk 的关联数组和 END 块,也可以组合 sort|uniq -c。
请求最多的 3 个路径
把请求数最多的 3 个路径按 경로 개수 格式、数量降序排列 3 行,保存到 /root/top3_paths.txt。
格式为‘路径 数量’。uniq -c 的输出顺序是‘数量 值’,因此最后需要调换顺序。
计算错误率
计算非 200 响应的比例,保留一位小数且不带 % 符号,写入 /root/error_rate.txt。
需要总行数和非 200 行数。在 awk 的 END 块中一次计算,就不必读取文件两遍。
创建摘要报告
在 /root/report.txt 中按以下顺序创建三行。
total=<전체 줄 수>errors=<200 이 아닌 줄 수>top_path=<가장 많이 요청된 경로>
把前面步骤得到的值合并成三行。格式和顺序必须准确。