使用grep cmd按首字母,@和“。”进行过滤。

时间:2016-09-06 05:22:15

标签: linux unix grep

我有一个包含许多电子邮件地址和随机文本的文件(testdata.txt)。 使用grep命令:

我想确保它们是电子邮件地址而不是文本,所以我想过滤掉它们,以便只包含带有“@”的行。

我还希望将它们过滤掉,以便只显示以字母A-M或a-m开头的电子邮件地址,并使用句点分隔名字和姓氏。

EG。 john.doe@gmail.com 但是,将包括johndoe@gmail.com。

最后,我想了解遵循这些规则的所有电子邮件地址的数量。

到目前为止,我只能通过

确保它们是电子邮件地址
grep -c "@" testdata.txt

使用grep cmd我还想查看有多少个电子邮件地址有政府域名(“gov”)。

我想检查它在行中有@符号并且它还包含gov。但是,当我执行以下任何操作时,我得不到我想要的答案。

grep -c "@\|gov" testdata.txt   I get the amount of lines that have a @ not @ and gov
grep -c "@/|gov" testdata.txt   I get 0
grep -c "@|gov" testdata.txt    I get 0

1 个答案:

答案 0 :(得分:3)

自下而上提出问题。

您在基本正则表达式模式下使用grep。在此模式下,\|表示 OR |表示符号 | /|表示符号 / | < /强>

如果您要在.gov域中查找电子邮件,您可能会寻找以 @ 开头的序列,然后是互联网域名中允许的符号和符号 .gov ,或 .GOV ,或 .Gov

借用another post on this site,您最终会得到类似

的内容
   grep -c "@[A-Za-z0-9][A-Za-z0-9.-]*\.\(gov\|Gov\|GOV\)"

为顶级域名跳过另外5种可能的拼写,例如:的 GOV 即可。 但是我会使用-i开关来表示忽略大小写来简化表达式

   grep -ci "@[a-z0-9][a-z0-9.-]*\.gov"

现在你不清楚使用分隔名称部分的点:

  

我还希望将它们过滤掉,以便只显示以字母A-M或a-m开头的电子邮件地址,并使用句点分隔名字和姓氏。例如。 john.doe@gmail.com但是,将包括johndoe@gmail.com。

所以我不会触及这部分。

最后,您可以使用范围表达式来过滤以字母 A 开头的地址 - M

   grep -ci "[a-m][a-z0-9._%+-]*@[a-z0-9][a-z0-9.-]*\.gov"

请注意这不是Internet邮件格式RFC 5322 address specification的实现,而只是用于主要用于教学目的的近似值。永远不要在生产代码中留下不完全符合要求的实现。