基于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
相关产品推荐
相关产品推荐

