2008-09-18 90 views
1

我的大多数用户的电子邮件地址都与他们在/etc/passwd中的个人资料相关联。他们总是在第五个领域,我可以抓住,但他们出现在第五个领域的逗号分隔列表中的不同位置。寻找正则表达式从/ etc/passwd中提取电子邮件地址

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

采样线从文件:

user1:x:1147:5005:User One,Department,,,[email protected]:/home/directory:/bin/bash 
user2:x:1148:5002:User Two,Department2,[email protected],:/home/directory:/bin/bash 
+1

[http://www.regular-expressions.info/email.html](http://www.regular-expressions.info/email.html) – 2008-09-18 18:30:07

回答

7

什么:

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

当组包含电子邮件地址。

[基于评论该地址并不总是得到由逗号结尾更新]

+0

该字段仅有时与结束逗号 – Brent 2008-09-18 18:32:17

+0

因此,在使用RegEx之前,请始终预先添加并附加逗号。 – 2008-09-18 18:43:06

+0

或用[^,:]代替[^,]: - 我认为这很简单 – Brent 2008-09-18 19:34:15

1

BTW第五个字段的被称为全球气候观测系统领域。有时拼写GECOS。

1

在@符号之前和之后搜索所有电子邮件有效字符。如:

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

贪婪的匹配应该拉入所有可能的东西,它会停在逗号或冒号处。

虽然,请检查哪些字符在电子邮件地址中有效。我已经留下了一些了(如+)

+0

下划线也是有效的... – 2008-09-18 18:30:21

-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

5

其实,这看起来像一个用awk完美的工作。现在,最喜欢的人,我会说:“我在awk中没有专家”,然后再继续......

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

将获得第5场,其中“:”是从外地分离器/ etc/passwd文件 - 它可能你想要的第五个领域。

awk -F , '{print $1}' 

会从标准输入获得第一场,其中“”是他delimimter所以

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

将从第五冒号分隔场得到的第一个逗号分隔的字段(名称字段)(中在你的/ etc/passwd文件中有所有类型的文件。

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

毫无疑问,在Awk中没有管道的情况下,无需这么做。我使用Awk将事物中的字段分开,而不是其他字段。我觉得很困惑,这也是从别人那爱的正则表达式...

-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])+)\]) 

没错。而已。 :)

0
sed 's/,*:\/.*//;s/^.*://;s/.*,//' /etc/passwd