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

AWK变量引用错误排查:匹配域名后缀结果不符合预期

AWK匹配域名后缀失败的解决方法

问题重现

相关文件内容

full-database.csv:

a.com,bbb
co.uk,ddd
a.comi,bbb
c.ukip,ddd

tld.csv:

co.uk
com

原执行脚本

while read -r ip 
do
awk -v i="$ip" -F, '$1 ~ /i$/ {print $0}' full-database.csv > tld-specific-database/$ip.csv
done < tld.csv

结果对比

  • 期望结果:
    cat co.uk.csv
        co.uk,ddd
    
    cat com.csv
        a.com,bbb
    
  • 实际结果:
    cat co.uk.csv
        a.comi,bbb
    
    cat com.csv
        a.comi,bbb
    

错误原因

  1. 正则变量引用错误:原脚本中把变量i直接写在正则/i$/里,这里的i是字面量字符,不是变量引用,导致正则匹配的是所有以字母i结尾的字符串,而非目标域名后缀。
  2. 特殊字符未转义:域名后缀中的.是正则特殊字符(匹配任意单个字符),直接使用会导致匹配范围错误,比如co.uk可能被误匹配为couk这类无关字符串。

修正后的脚本

方法一:Shell层先转义特殊字符

mkdir -p tld-specific-database
while read -r tld 
do
    # 转义TLD中的点号,避免正则误匹配
    escaped_tld=$(echo "$tld" | sed 's/\./\\./g')
    awk -v tld="$escaped_tld" -F, '$1 ~ ("^.*" tld "$") {print $0}' full-database.csv > tld-specific-database/"$tld".csv
done < tld.csv

方法二:AWK内部处理转义

mkdir -p tld-specific-database
while read -r tld 
do
awk -v tld="$tld" -F, '
    BEGIN {
        # 转义TLD中的点号
        gsub(/\./, "\\.", tld)
    }
    $1 ~ ("^.*" tld "$") {print $0}
' full-database.csv > tld-specific-database/"$tld".csv
done < tld.csv

验证结果

执行修正后的脚本后,得到符合预期的结果:

cat tld-specific-database/co.uk.csv
co.uk,ddd

cat tld-specific-database/com.csv
a.com,bbb

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 19:40:30