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

Linux下如何快速将子域前置到域名每行并提升处理速度?

你的问题核心在于嵌套while循环反复读取15万条的子域文件,总共要读50次,这IO开销直接拉满了,所以才会耗时超1小时。下面给你几个高效的解决办法,能把时间压缩到几秒或几十秒:

方案1:用awk一次性处理(最快最简洁)

awk可以先把小体积的域名文件全读进内存,然后遍历大的子域文件直接拼接输出,全程只需要读两次文件,彻底避免重复IO的浪费。

如果不需要严格保持域名的顺序,用这个版本:

awk 'NR==FNR {doms[$0]; next} {for (d in doms) print $0 "." d}' file1 file2 > "$fileOut"

要是你需要和预期结果完全一致的域名顺序,就用索引数组来维护顺序:

awk 'NR==FNR {doms[++n]=$0; next} {for (i=1; i<=n; i++) print $0 "." doms[i]}' file1 file2 > "$fileOut"

简单解释下:

  • NR==FNR 是awk的经典写法,用来判断当前处理的是第一个输入文件(这里是file1域名列表),把每一行域名存进数组
  • 处理第二个文件(file2子域)时,遍历所有存储的域名,直接拼接子域和域名输出
方案2:用xargs实现并行处理

如果想利用多核CPU进一步提速,可以把每个域名作为独立任务并行处理。因为域名只有50条,最多能开50个并行进程,每个进程负责把所有子域和当前域名拼接:

cat file1 | xargs -P 0 -I {} bash -c 'sed "s/^/{}.&/" file2' > "$fileOut"

参数说明:

  • -P 0:让xargs使用尽可能多的CPU核心(也可以指定具体数值,比如-P 8限制用8核)
  • -I {}:把file1的每一行内容替换成{},作为后续命令的参数
  • sed "s/^/{}.&/" file2:给file2的每一行开头加上「当前域名+点」,完成拼接

这个方法通过并行拆分任务,把原本的串行处理改成多进程同时跑,也能大幅减少总耗时。

方案对比

原嵌套循环的最大问题是重复读大文件,50次IO操作直接拖慢了速度。而上面的方案:

  • awk方案IO开销最小,全程只读两次文件,内存内完成拼接,速度最快
  • xargs方案虽然每个域名还是要读一次子域文件,但并行处理能把总时间压下来

实际测试的话,awk方案基本几秒就能搞定,xargs方案也不会超过几十秒,完全解决你1小时的耗时问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 22:22:49