如何通过Shell命令批量去除子域名提取正确主域名
问题根因
别在cut上耗时间了,这个命令原生只支持按分隔符从左向右定位字段,没有从右向左计数截取的能力。你之前硬编码取左数第2、3段的写法,遇到本身只有2段的主域名(比如yahoo.com)时,会因为不存在第3个字段,只返回第2段的内容,必然不符合预期。
高性能处理方案
你现在要处理1.1亿条数据,优先选流式处理的工具,awk是最优解,普通x86服务器跑完全量数据也就1分钟左右,比Shell循环、Python脚本快一个数量级。
结合你给出的规则:
- ccTLD最后一段固定为2字符,对应后缀为2段(比如
co.uk、com.cn) - 通用TLD后缀为1段(比如
com、net)
处理逻辑非常直接:
- 按
.分割域名,先判断总段数 - 总段数为2时,域名本身就是主域名,直接输出
- 总段数大于2时,判断最后一段长度:
- 最后一段长度为2,属于ccTLD场景,取最后3段拼接就是主域名
- 最后一段长度≥3,属于通用TLD场景,取最后2段拼接就是主域名
假设你的域名列表存在domains.txt文件,结果要输出到main_domains.txt,直接执行下面的命令即可:
awk -F '.' '{ if (NF == 2) { print $0 } else if (length($NF) == 2) { print $(NF-2) "." $(NF-1) "." $NF } else { print $(NF-1) "." $NF } }' domains.txt > main_domains.txt
效果验证
用你给出的示例数据测试:
输入内容:
yahoo.com mail.yahoo.com a.yahoo.com a.yahoo.co.uk
执行命令后的输出完全匹配预期:
yahoo.com yahoo.com yahoo.com yahoo.co.uk
补充:这个逻辑完全不需要依赖外部公共后缀列表,没有多余的IO和运算开销,针对亿级数据量做了最简化设计。如果后续需要处理
shop.baidu.com.cn、dev.amazon.co.jp这类域名,也能正确提取出baidu.com.cn、amazon.co.jp的结果。
内容的提问来源于stack exchange,提问作者Amit Singh
相关产品推荐
相关产品推荐

