我有一个包含许多电子邮件地址和随机文本的文件 (testdata.txt)。 使用 grep 命令:
我想确保它们是电子邮件地址而不是文本,所以我想过滤掉它们以便只包含带有“@”的行。
我还想过滤掉它们,以便只显示以字母 A-M 或 a-m 开头的电子邮件地址,并用句点分隔名字和姓氏。
例如。 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
最佳答案
自下而上地回答你的问题。
您正在以 基本正则表达式 模式使用 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 个可能的拼写,例如政府。
但是我会使用 -i
开关,这意味着忽略大小写 来简化表达式
grep -ci "@[a-z0-9][a-z0-9.-]*\.gov"
现在您对使用点分隔名称的各个部分不是很清楚:
I also want to filter them out so that only email addresses that start with the letter A-M or a-m are shown and have a period separating the first name and last name. Eg. john.doe@gmail.com However, johndoe@gmail.com would be included.
所以我不会碰这部分。
最后,您可以使用范围表达式 来过滤以字母A-M
开头的地址 grep -ci "[a-m][a-z0-9._%+-]*@[a-z0-9][a-z0-9.-]*\.gov"
请注意,这不是 Internet 消息格式 RFC 5322 address specification 的实现。但只是一个主要用于教学目的的近似值。切勿在生产代码中留下不完全合规的实现。
关于linux - 使用 grep 命令按首字母、@ 和 "."进行过滤,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39341161/