sed/awk/grep 解析过滤后的 txt 文件上的电子邮件

sed/awk/grep 解析过滤后的 txt 文件上的电子邮件

我有几个 txt 文件,如果文件中包含文本“Provider”,我想从该文件中提取电子邮件。文本文件的格式不一样。 “provider”可以出现在文本中的任何位置。

这是一些简短的示例:
文件1.txt
姓名: Joe1
提供者
...
电子邮件[电子邮件受保护]

文件2.txt
姓名: Joe2
...
客户
...
电子邮件[电子邮件受保护]

文件3.txt
姓名: Joe3
...
提供者
电子邮件[电子邮件受保护]

我正在使用这个短代码,但它返回所有电子邮件

$ awk -F, '{
  for (i=1; i<=NF; i++)
    if ($i ~ /@/)
       print $i
}' *

你能帮我吗?

谢谢

答案1

$ awk 'FNR==1 { provider = False } 
       $0 ~ /Provider/ { provider = True} 
       $0 ~ /@/ && provider == True {
         for (i=1; i<=NF; i++) {
           if ($i ~ /@/) print $i;
         }
       }' *
  • 对于每个文件设置providerFalse第一行
  • 如果一行包含Provider将提供程序设置为True
  • 如果一行包含 an@并且之前见过该单词Provider,则迭代字段并打印包含该单词的字段@

答案2

你可以试试:

for fname in file*.txt
do
    if grep 'Provider' ${fname} &> /dev/null ; then
       grep -oP 'Email[[:space:]]*\K(.*@.*)' ${fname}
    fi
done

答案3

grep -l Provider file*.txt | xargs grep -o '[^@[:space:]]+@[^@[:space:]]+'

对于电子邮件地址,有更准确的正则表达式,例如[0-9a-zA-Z._%+-]+@[0-9a-zA-Z.-]+\.[a-zA-Z]{2,},如果您需要更精确的话。

相关内容