user9@totl.example.com>, size=35020827, class=-30, nrcpts=1, msgid=<2m96JLQblfm/fh.01u3YnFYK0bc3pmOExg2vA.totl.example.com>, proto=ESMTP, daemon=MTA-v6, relay=lemur.totl.example.com
user11@shoe-bags.example.com>, size=18071179, class=-30, nrcpts=1, msgid=<BhaYKoWuhDhrUQcT5.+tF6eKTCu0459KjSflNxLg.shoe-bags.example.com>, proto=ESMTP, daemon=MTA-v6, relay=dog.shoe-bags.example.com
user23@stellar-patrol.example.com>, size=27057917, class=-30, nrcpts=1, msgid=<VaD1xW8SduAYImck.Mbx1MBcKTjBPlQpcaDhJRA.stellar-patrol.example.com>, proto=ESMTP, daemon=MTA-v6, relay=feinstein.stellar-patrol.example.com
user6@planet-express.example.com>, size=15212380, class=-30, nrcpts=1, msgid=<4wN8i90XT.BIdywWoKxNjeEM1q.planet-express.example.com>, proto=ESMTP, daemon=MTA-v6, relay=fry.planet-express.example.com
user19@blackmesa.example.com>, size=44656174, class=-30, nrcpts=1, msgid=<1froj29vndf7h0.Qzoi+1hDEQOVp1frnQvWO.blackmesa.example.com>, proto=ESMTP, daemon=MTA-v6, relay=barney.blackmesa.example.com
user2@stellar-patrol.example.com>, size=4556372, class=-30, nrcpts=1, msgid=<jnugzy+Z.L82rx1mhoSXi0RmK/yNP.stellar-patrol.example.com>, proto=ESMTP, daemon=MTA-v6, relay=feinstein.stellar-patrol.example.com
user7@macrohard.example.com>, size=35391498, class=-30, nrcpts=1, msgid=<fXr7+HM1U7ZpbJqxf.iJs6q9r.macrohard.example.com>, proto=ESMTP, daemon=MTA-v6, relay=corporate-mail-01.macrohard.example.com
user7@lawanda.example.com>, size=46296174, class=-30, nrcpts=1, msgid=<UJHE3Y4uEn.JBT3RESrNYL+fH5dFTGt5A.lawanda.example.com>, proto=ESMTP, daemon=MTA-v6, relay=achilles.lawanda.example.com
user14@feddit.example.com>, size=12197030, class=-30, nrcpts=1, msgid=<gpq6lYSHHC67d.ZjyKUitfcPwOlA/OEc++.feddit.example.com>, proto=ESMTP, daemon=MTA-v6, relay=kittin.feddit.example.com
我希望只提取每行的电子邮件地址部分,例如user9@tot1.example.com
我目前正在使用这种技术:
cat file | grep -o 'user.*?com'
然而,自从&#39; .com&#39;偶尔在线路的尽头我仍然可以让整条线路返回。
我的示例输出应该类似于:
user9@totl.example.com
user11@shoe-bags.example.com
user23@stellar-patrol.example.com
... etc
这怎么可能?非常感谢您的帮助
答案 0 :(得分:2)
这应该做:
grep -o 'user[^[:space:]]\+\.com' file
并观察我在这里不需要cat
。
这使用字符类[:space:]
。我所说的是,我希望以user
开头的所有内容都以.com
结尾,并且只包含非空格字符(至少有一个)([^[:space:]]\+
)
关于您的解决方案:您需要-P
的{{1}}开关才能使用Perl的正则表达式,因此grep
被视为匹配任何内容,非贪婪 :
.*?
会起作用。
现在我希望您没有任何有电子邮件grep -Po 'user.*?com' file
或类似邮件的访客,否则此邮件将会失败,因为您只会获得user42@coolcompagny.com
user42@coolcom
使用正则表达式解析电子邮件地址根本不是一项简单的任务。
答案 1 :(得分:0)
您可以使用awk获取该行的部分内容。在你的情况下,它会是这样的:
cat file | grep -o 'user.*?com' | awk -F',' '{print $1}'
有关更多功能,请查看GNU Awk用户指南http://www.gnu.org/software/gawk/manual/gawk.html
答案 2 :(得分:0)
。*?模式仅在grep -p选项时才有效,该选项启用Perl样式的regexp。添加它,它应该工作。