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

Bash对比IP与恶意域名IP列表时出现重复行输出问题如何解决

问题原因分析
  • 核心逻辑错误:你对每条IP记录遍历全量恶意IP列表时,触发匹配就输出一次带标记的行。如果恶意IP列表本身存在重复IP(多个恶意域名解析到同一个IP),就会输出多条带标记的重复行。如果你后续把正常打印逻辑移到了for循环外,匹配到恶意IP的条目还会出现「带标记行+无标记正常行」的组合,二者内容不同,uniq 无法识别为重复行,自然不会去重。
  • 工具使用误区:uniq 仅能合并内容完全一致的相邻行,带标记和不带标记的同一IP行内容有差异,当然不会被去重。
  • 潜在问题:dig +short 输出会包含CNAME记录,你直接全部拿来当IP匹配,可能出现误判。
修复方案

优化逻辑去掉嵌套循环,先把所有恶意IP过滤去重后存入临时文件,每条IP仅做一次匹配判断即可,效率更高也不会出现重复输出:

# 提取所有恶意IP,过滤非IP格式的内容并去重
dig +short -f dns.blacklist.txt | grep -E '^[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+$' | sort -u > bad_ips.txt

# 提取日志中的IP统计结果,逐行判断是否为恶意IP
awk '{ print $1 }' "$logfile" | sort | uniq -c | sort -nr | awk '{print $2 "\t" $1}' | while read -r ip count; do
    if grep -qxF "$ip" bad_ips.txt; then
        echo -e "$ip\t$count\t*bad domain!*"
    else
        echo -e "$ip\t$count"
    fi
done

# 清理临时文件
rm -f bad_ips.txt response

修复点说明:

  1. 先对dig的输出做IP格式校验,过滤掉CNAME等非IP内容,再做去重处理,保证恶意IP列表无重复条目
  2. 去掉嵌套循环,每条IP只做一次匹配判断,要么输出带标记行,要么输出正常行,从根源上避免重复输出
  3. 前面提取IP统计时已经做过uniq -c处理,IP条目天然无重复,不需要额外加uniq命令

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 04:54:04