1

我的大多数用户都有与他们的个人资料相关联的电子邮件地址/etc/passwd。它们总是在我可以抓取的第 5 个字段中,但它们出现在第 5 个字段中以逗号分隔的列表中的不同位置。

有人可以给我一个正则表达式来从这个文件的一行中获取电子邮件地址(用逗号分隔)吗?(我将在 bash 脚本中使用 grep 和 sed)

文件中的示例行:

user1:x:1147:5005:User One,Department,,,email@domain.org:/home/directory:/bin/bash
user2:x:1148:5002:User Two,Department2,email2@gmail.com,:/home/directory:/bin/bash
4

7 回答 7

6

关于什么:

,([^@]+@[^,:]+)

组包含电子邮件地址的位置。

[根据评论更新地址并不总是以逗号结尾]

于 2008-09-18T18:28:45.627 回答
5

实际上,这对于 Awk 来说是一个完美的工作。现在,像大多数人一样,我会在继续之前说“我不是 Awk 专家”...

awk -F : '{print $5}' /etc/passwd

将获得第 5 个字段,其中 ':' 是来自 /etc/passwd 的字段分隔符 - 它可能是您想要的第 5 个字段。

awk -F , '{print $1}'

将从标准输入中获取第一个字段,其中“,”是他的定界符吗?

awk -F : '{print $5}' /etc/passwd | awk -F , '{print $1}'

将从您的 /etc/passwd 文件中的第五个冒号分隔字段(包含所有那种杂乱无章的字段!)中获取第一个逗号分隔字段(名称字段)。

调整打印 $1 以获取包含您的电子邮件的字段。

毫无疑问,没有 awk 中的管道就可以做到这一点。我使用 Awk 来分割事物中的字段,而不是其他。我觉得它令人困惑,那是来自喜欢正则表达式的人......

于 2008-09-18T18:39:21.063 回答
2
sed -r -e "s/^.*[,:]([^,:]+@[^,:]+).*$/\1/g" /etc/passwd

会成功的

于 2008-09-18T19:12:11.107 回答
1

搜索 @ 符号前后的所有电子邮件有效字符。像:

[-A-z0-9。]+@[-A-z0-9。]+

贪婪匹配应该尽可能地提取所有内容,并且会在逗号或冒号处停止。

不过,请检查电子邮件地址中哪些字符有效。我遗漏了一些(比如+)

于 2008-09-18T18:29:02.273 回答
0
sed 's/,*:\/.*//;s/^.*://;s/.*,//' /etc/passwd
于 2010-03-19T04:29:42.770 回答
-1
[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?

应该抓住大多数 emials

于 2008-09-18T18:29:08.357 回答
-1

标准RFC 2822怎么样:

(?:[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*|"(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21\x23-\x5b\x5d-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])*")@(?:(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?|\[(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?|[a-z0-9-]*[a-z0-9]:(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21-\x5a\x53-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])+)\])

是的。就是这样。:)

于 2008-09-18T22:51:03.437 回答