如何在404 awk报告中排除末段两位的IP且不误删末段三位IP
解决思路与方案
首先咱们来拆解问题根源:你单独用grep -v "10.1.1.18 "能拿到正确内容,但加上report_errors.awk后无输出,大概率是两种工具配合时的匹配逻辑冲突,或是grep的过滤方式不够严谨,也可能是awk脚本的字段依赖没对齐。下面给你几个靠谱的解决办法:
方法1:把IP排除逻辑直接整合到awk中(推荐)
比起用grep+awk管道,直接在awk里处理IP排除和404筛选更高效,还能避免管道传递时的格式问题。
方式A:调用awk时追加排除条件
如果不想修改原脚本,可以在调用时先过滤测试IP,再执行你的错误报告脚本:
awk '$1 != "10.1.1.18" && $9 == 404' access.log | awk -f report_errors.awk
这里假设你的日志中第一个字段是客户端IP,第九个字段是HTTP状态码(大部分标准access log格式都是这样)。如果你的日志格式不同,要对应调整$1和$9的字段号。
方式B:修改原awk脚本内置排除逻辑
直接在report_errors.awk开头加入IP过滤,这样每次调用脚本都会自动排除测试IP:
# report_errors.awk BEGIN { # 保留你原来的初始化逻辑,比如设置输出格式、统计变量等 } # 先排除测试IP,再执行原有错误处理逻辑 $1 != "10.1.1.18" { # 这里放你原来的脚本代码,比如筛选404、统计频次等 if ($9 == 404) { # 示例逻辑:打印符合条件的日志行 print $0; # 其他统计或输出逻辑... } } END { # 保留你原来的结束逻辑,比如输出统计结果等 }
方法2:优化grep的排除正则,避免误匹配或漏匹配
如果坚持要用grep+awk的组合,你之前用的"10.1.1.18 "依赖IP后必须有空格,但有些access log中IP后面可能是-(比如10.1.1.18 - - [时间]...),这会导致grep没正确排除测试IP,进而让awk处理大量无效404,或是因为格式问题无输出。
改用更严谨的扩展正则来匹配IP的边界:
grep -vE '10\.1\.1\.18([^0-9]|$)' access.log | awk -f report_errors.awk
这个正则的意思是:匹配10.1.1.18后面跟着非数字字符或者行尾,既能排除10.1.1.18这个测试IP,又不会误排除10.1.1.180、10.1.1.189这类末段三位的有效IP。
排查步骤:如果还是无输出
- 先验证grep后的输出确实包含404条目:
如果没输出,说明日志里剩下的条目本来就没有404,那awk自然无输出。grep -vE '10\.1\.1\.18([^0-9]|$)' access.log | grep 404 - 检查awk脚本的字段是否正确:
看看输出的IP和状态码是否符合预期,如果状态码不是grep -vE '10\.1\.1\.18([^0-9]|$)' access.log | awk '{print $1, $9}'$9,就需要调整脚本里的字段号。
内容的提问来源于stack exchange,提问作者Einstein47
相关产品推荐
相关产品推荐

