我有一个包含许多电子邮件地址和随机文本的文件(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
答案 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的实现,而只是用于主要用于教学目的的近似值。永远不要在生产代码中留下不完全符合要求的实现。