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
错误原因
- 正则变量引用错误:原脚本中把变量
i直接写在正则/i$/里,这里的i是字面量字符,不是变量引用,导致正则匹配的是所有以字母i结尾的字符串,而非目标域名后缀。 - 特殊字符未转义:域名后缀中的
.是正则特殊字符(匹配任意单个字符),直接使用会导致匹配范围错误,比如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
相关产品推荐
相关产品推荐

