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

有人可以给我一个 正则表达式仅获取电子邮件地址 (用逗号分隔)来自此文件中的一行?(我将使用 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
有帮助吗?

解决方案

关于什么:

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

其中组包含电子邮件地址。

[根据地址并不总是以逗号终止的评论进行更新]

其他提示

标准电子邮件正则表达式应该可以正常工作:

http://regexlib.com/DisplayPatterns.aspx

您还可以尝试一下优秀的: 网站!

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

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

将得到第五个字段,其中“:”是 /etc/passwd 中的字段分隔符 - 它可能是您想要的第五个字段。

awk -F , '{print $1}'

将从标准输入中获取第一个字段,其中 ',' 是他的分隔符,所以

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

将从 /etc/passwd 文件中的第五个冒号分隔字段(其中包含所有此类内容的字段!)中获取第一个逗号分隔字段(名称字段)。

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

毫无疑问,在 Awk 中没有管道也可以做到这一点。我使用 Awk 来分割事物中的字段,仅此而已。我觉得这很令人困惑,这是来自一个喜欢正则表达式的人......

顺便说一句,第五个字段称为 GCOS 字段。有时拼写为 GECOS。

sed -r -e "s/^.*[,:]([^,:]+@[^,:]+).*$/\1/g" /etc/passwd

会成功的

搜索 @ 符号之前和之后的所有电子邮件有效字符。喜欢:

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

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

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

sed 's/,*:\/.*//;s/^.*://;s/.*,//' /etc/passwd
[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?

应该捕获大多数 emial

标准怎么样 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])+)\])

是的。就是这样。:)

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top