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

如何使用grep跨文件匹配子串 筛选指定域名对应的邮箱地址

实现方法

面对200万条邮箱、6000个待匹配域名的体量,绝对不要写shell循环逐域名调用grep扫描邮箱文件——这种写法会重复扫描大文件6000次,跑几个小时都出不了结果。
正确的做法是用grep的多模式匹配参数,单次遍历邮箱文件完成所有比对,正常几秒就能跑完。

匹配规则预处理

直接用原始域名做匹配会出现三类误匹配:

  • 没有前缀约束:比如域名b.com会误匹配xxx@ab.com
  • 没有后缀约束:比如域名hotmail.com会误匹配xxx@hotmail.com.cn
  • 正则通配符问题:正则里.代表匹配任意字符,fb.com会误匹配fb1com、fbXcom这类字符串

所以需要先把File2里的域名处理成精确匹配规则:每个域名前加@、后加行尾标记$、把域名里的.转义为\.。

执行命令

不需要生成中间临时文件,直接用下面两条命令即可分别导出匹配、不匹配的结果:

  • 导出匹配域名后缀的邮箱到matched.csv:
grep -E -f <(sed 's/\./\\./g; s/^/@/; s/$/$/' File2) File1.csv > matched.csv
  • 导出不匹配域名后缀的邮箱到unmatched.csv:
grep -E -v -f <(sed 's/\./\\./g; s/^/@/; s/$/$/' File2) File1.csv > unmatched.csv

效果验证

用你提供的示例文件运行后,matched.csv输出完全符合预期:

abc@fb.com
abc@hotmail.com
abc@live.com

unmatched.csv会输出剩余3条不匹配的记录:

abc@gmail.com
abc@fmail.com
abc@outlook.com

速度优化

如果是Linux系统自带的GNU grep,可以加--mmap参数,通过内存映射读取大文件,速度还能提升15%左右,示例:

grep --mmap -E -f <(sed 's/\./\\./g; s/^/@/; s/$/$/' File2) File1.csv > matched.csv

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 04:21:40