Linux 如何获取有帮助的电子邮件&;don';是否以所需的域结束?

Linux 如何获取有帮助的电子邮件&;don';是否以所需的域结束?,linux,bash,grep,Linux,Bash,Grep,我在一个文件emails.txt上有一个电子邮件列表,如何使用GREP或类似的东西在两个不同的文件中获取以@gmail.com结尾的电子邮件,以及不以@gmail.com结尾的电子邮件 例如 ***emails.txt*** email_1@gmail.com email_2@gmail.com email_3@hotmail.com email_4@example.com 我需要两种不同的输出,如: ***emails-gmail.txt*** email_1@gmail.com email

我在一个文件
emails.txt
上有一个电子邮件列表,如何使用GREP或类似的东西在两个不同的文件中获取以
@gmail.com
结尾的电子邮件,以及不以
@gmail.com
结尾的电子邮件

例如

***emails.txt***
email_1@gmail.com
email_2@gmail.com
email_3@hotmail.com
email_4@example.com
我需要两种不同的输出,如:

***emails-gmail.txt***
email_1@gmail.com
email_2@gmail.com


要获取包含“gmail.com”的电子邮件,请执行以下操作:

cat emails.txt  | grep @gmail.com
cat emails.txt  | grep -v @gmail.com
要获取不包含“gmail.com”的电子邮件,请执行以下操作:

cat emails.txt  | grep @gmail.com
cat emails.txt  | grep -v @gmail.com
这不起作用

您可以仅使用
grep
执行此操作,然后将STDOUT重定向到如下文件:

  • 来自
    @gmail.com
    的邮件:

    grep @gmail.com emails.txt > emails-gmail.txt
    
    grep -v @gmail.com emails.txt > emails-other.txt
    
  • 邮件不是
    @gmail.com

    grep @gmail.com emails.txt > emails-gmail.txt
    
    grep -v @gmail.com emails.txt > emails-other.txt
    
    -v
    的作用是返回不包含
    @gmail.com
    的行


上述解决方案没有按预期工作,因为
grep
使用正则表达式,而在正则表达式中,点
表示匹配任何字符。我们可以使用substitute
grep
代替
fgrep
grep-F
,它们将参数作为文本字符串而不是正则表达式!然后它按预期工作。此外,您还可以使用
\.
转义正则表达式点。然后你可以再做一次

正确的做法是:

awk '{print > ("emails-" (/@gmail\.com$/ ? "gmail" : "other") ".txt")}' emails.txt

这将解析您的输入文件一次,同时生成两个输出文件,并将正确处理到目前为止发布的其他解决方案可能失败的潜在错误匹配。

无需
cat
,但除此之外+1我的意思是,
cat emails.txt | grep@gmail.com
grep@gmail.com emails.txt
完全相同这不是怎么做的。当您的输入包含
bob@gmailscom.net
。确实是@EdMorton,但无论出于何种目的,OP在这里都处于学习曲线上,我相信这将是他们的下一站。这不是怎么做的。当您的输入包含
bob@gmailscom.net
。事实上,这是个不错的选择。编辑您还需要添加字符串的结尾(在本例中也是行的结尾)锚定
$
so
bob@gmail.company.org
不匹配:
grep'@gmail\.com$”文件