You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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。

排查步骤:如果还是无输出

  1. 先验证grep后的输出确实包含404条目:
    grep -vE '10\.1\.1\.18([^0-9]|$)' access.log | grep 404
    
    如果没输出,说明日志里剩下的条目本来就没有404,那awk自然无输出。
  2. 检查awk脚本的字段是否正确:
    grep -vE '10\.1\.1\.18([^0-9]|$)' access.log | awk '{print $1, $9}'
    
    看看输出的IP和状态码是否符合预期,如果状态码不是$9,就需要调整脚本里的字段号。

内容的提问来源于stack exchange,提问作者Einstein47

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 10:08:21