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

基于Dnsmasq语法,用AWK移除匹配允许列表的黑名单行(OpenWRT)

适配Dnsmasq语法的黑名单AWK处理方案

需求说明

删除Dnsmasq格式黑名单文件中,行内域名(含子域名)匹配允许列表条目的行。因OpenWRT默认自带AWK,故选用该工具而非需额外安装的gawk。

示例文件

Dnsmasq格式黑名单文件

local=/randomsites.com/
local=/calendar.google.com/
local=/google.com/
local=/google.com.fake.com/
local=/fakegoogle.com/

允许列表文件

google.com

期望输出(new_blocklist)

local=/randomsites.com/
local=/google.com.fake.com/
local=/fakegoogle.com/

问题重现

尝试修改此前处理无语法前缀黑名单的高效AWK脚本(双核路由器处理30万行约10秒)以适配Dnsmasq语法,但修改后的脚本无法正确移除local=/calendar.google.com/条目。执行awk -f tst.awk allow block得到不符合预期的输出:

local=/randomsites.com/
local=/calendar.google.com/
local=/google.com.fake.com/
local=/fakegoogle.com/

修改后的问题脚本

$ cat tst.awk
BEGIN { FS="." }
NR==FNR {
    allow[$0"/"]
    next
}
{
    addr = $NF
    for ( i=NF-1; i>=1; i-- ) {
        addr = $i FS addr
        if ( substr(addr,8) in allow ) {
            next
        }
    }
}
{ print }

此前适配无语法前缀黑名单的正确脚本(Ed Morton提供)

$ cat tst.awk
BEGIN { FS="." }
NR==FNR {
    allow[$0]
    next
}
{
    addr = $NF
    for ( i=NF-1; i>=1; i-- ) {
        addr = $i FS addr
        if ( addr in allow ) {
            next
        }
    }
}
{ print }

正确方案性能测试

在Netgear R7800(OpenWRT系统,2015款双核CPU)上测试了@markp-fuso和@Ed Morton的两个正确方案,性能数据如下:

@markp-fuso方案

300k行黑名单+13行允许列表 = 23.3秒
300k行黑名单+300k行允许列表 = 21.5秒

@Ed Morton方案

300k行黑名单+13行允许列表 = 47.4秒
300k行黑名单+300k行允许列表 = 46秒

注:两个方案在允许列表更大时运行速度更快。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 03:40:21