我的大多数用户都在/etc/passwd
中拥有与其个人资料相关联的电子邮件地址。它们总是在第5个字段中,我可以抓取它,但它们出现在第5个字段中以逗号分隔的列表中的不同位置。
有人可以从这个文件的一行中给我一个正则表达式来获取电子邮件地址(用逗号分隔)吗? (我将使用grep和sed来自bash脚本)
来自档案的示例行:
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
答案 0 :(得分:7)
怎么样:
,([^ @] + @ [^ ,:] +)
组中包含电子邮件地址。
[根据评论更新地址并不总是以逗号结束]
答案 1 :(得分:6)
答案 2 :(得分: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来分割事物中的字段而不是其他。我发现它令人困惑,而且那是来自喜欢正则表达式的人......
答案 3 :(得分:1)
BTW第五个字段称为GCOS字段。有时拼写为GECOS。
答案 4 :(得分:1)
搜索@符号前后的所有电子邮件有效字符。像:
[ - A-Z0-9 ] + @ [ - A-Z0-9 ] +
贪婪的匹配应该尽可能地吸引它,并且它将停留在逗号或冒号处。
检查电子邮件地址中哪些字符有效。我已经离开了一些(比如+)
答案 5 :(得分:1)
sed -r -e "s/^.*[,:]([^,:]+@[^,:]+).*$/\1/g" /etc/passwd
会做的伎俩
答案 6 :(得分:0)
sed 's/,*:\/.*//;s/^.*://;s/.*,//' /etc/passwd
答案 7 :(得分:-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])?
应该抓住大多数情人
答案 8 :(得分:-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])+)\])
是的。而已。 :)