寻找正则表达式从/ etc / passwd中提取电子邮件地址
时间:2020-03-06 14:22:47 来源:igfitidea点击:
我的大多数用户在/ etc / passwd中都具有与其个人资料相关联的电子邮件地址。它们始终位于第5个字段中,我可以抓住它们,但是它们出现在第5个字段中逗号分隔列表中的不同位置。
有人可以给我一个正则表达式以仅从此文件中的行中提取电子邮件地址(用逗号分隔)吗? (我将使用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
解决方案
标准的电子邮件正则表达式应该可以正常工作:
http://regexlib.com/DisplayPatterns.aspx
我们也可以尝试出色的网站:
关于什么:
,([^@]+@[^,:]+)
该组包含电子邮件地址的位置。
[根据评论更新,地址并不总是以逗号结尾]
BTW第五字段称为GCOS字段。有时拼写为GECOS。
搜索@符号之前和之后的所有电子邮件有效字符。喜欢:
[-A-z0-9.]+@[-A-z0-9.]+
贪婪的匹配应该尽其所能,并且它会止于逗号或者冒号。
但是,请检查哪些字符在电子邮件地址中有效。我遗漏了一些内容(例如+)
[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?
应该能赶上大多数的爱慕者
实际上,这对于Awk来说似乎是一项完美的工作。现在,像大多数人一样,在继续进行操作之前,我会说"我不是Awk的专家"
awk -F : '{print }' /etc/passwd
会得到第5个字段,其中":"是/ etc / passwd中的字段分隔符,可能是我们想要的第5个字段。
awk -F , '{print }'
会从标准输入中获得第一个字段,其中他是delimimter,所以
awk -F : '{print }' /etc/passwd | awk -F , '{print }'
将从/ etc / passwd文件中的第五个冒号分隔的字段(其中包含所有此类残篇!)中获得第一个逗号分隔的字段("名称"字段)。
调整打印$ 1,以获取包含电子邮件的字段。
毫无疑问,没有Awk中的管道,可以执行此操作。我使用Awk来拆分事物中的字段,而没有太多其他内容。我觉得很困惑,那是因为有人喜欢正则表达式。
sed -r -e "s/^.*[,:]([^,:]+@[^,:]+).*$//g" /etc/passwd
会成功的
标准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])+)\])
是的。而已。 :)
sed 's/,*:\/.*//;s/^.*://;s/.*,//' /etc/passwd