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

如何通过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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 02:57:21