linux - 使用 grep 命令按首字母、@ 和 "."进行过滤

标签 linux unix grep

我有一个包含许多电子邮件地址和随机文本的文件 (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/

相关文章:

linux - 启动时自动挂载独立分区时 systemd/udev 依赖失败

linux - 如何将 MacOS CouchDB 数据移动到 Linux?

ubuntu - 如何为 ext4 和 NTFS 分区上的相同文件获取相同的文件大小?

linux - 如何在以其他用户身份使用 sudo 时运行多个命令

linux - node.js 请求超时

php - 不同的服务器是否应该将 unix 时间戳转换为不同的日期?

mysql - Is Mysql now() 从服务器时间获取时间戳

linux - 如何查找另一个文件中缺少的行

grep - 将两个 grep 的输出与 diff 一起使用

regex - Grep for word and line before match