如何从 Linux 中的混合数据文件中提取电子邮件或域名

如何从 Linux 中的混合数据文件中提取电子邮件或域名

文件内容:

17541 来自电子邮件      [电子邮件保护]      入站
策略管理器信封分析
分析器
17541 来自电子邮件      [电子邮件保护]      入站
策略管理器信封分析
分析器
17541 来自域名 test.co.uk 入站
策略管理器信封分析
分析器
17541 来自域名 yahoo.co.uk 入站
策略管理器信封分析
分析器
17541 来自电子邮件      [电子邮件保护]      入站
策略管理器信封分析
分析器

我使用该命令提取电子邮件并将其转换为新格式,但无法提取域。我使用“sort -u”,因为文件中有些邮件是重复的。

cat 1| grep -E -o "\b[a-zA-Z0-9.-]+@[a-zA-Z0-9.-]+\.[a-zA-Z0-9.-]+\b"|sed -e 's/^/E,/'|sort -u

grep domains 后的预期视图:

测试网
英国雅虎

答案1

您的 grep 表达式没有问题,但是 sed 表达式不起作用,请将其更改为:

< 1 grep -Eo '\b[a-zA-Z0-9.-]+@[a-zA-Z0-9.-]+\.[a-zA-Z0-9.-]+\b' | sed -e 's/[^@]*@//' | sort -u

假设输入文件名为1。你也可以用 grep 完成整个操作:

< 1 grep -Eo '\b[a-zA-Z0-9.-]+@[a-zA-Z0-9.-]+\.[a-zA-Z0-9.-]+\b' | grep -Eo '[^@]+$' | sort -u

答案2

awk句话给出了你想要的输出

awk '/From Email/ { if( !match($4,"@") ){ print $4 } }' inputfile

它选择包含“发件人电子邮件”的行并检查第四列是否包含@。match如果您愿意,可以使用正则表达式将其与域而不是电子邮件地址匹配。

答案3

您可以使用 grep 命令从数据文件中提取电子邮件:

 grep -oe "[a-zA-Z0-9._]\+@[a-zA-Z]\+.[a-zA-Z]\+" abc.txt

此命令将为您提供所有电子邮件地址。

相关内容