Я изменил ваше регулярное выражение, добавив пунктуацию (например.-_ И т. Д.), Изменив его на
egrep -ho "[[:graph:]]+@[[:graph:]]+"
Это все еще довольно чисто и соответствует ... ну, почти все с @ в нем, конечно. Также домены 3-го уровня, также адреса с «%» или «+» в них. См. http://www.delorie.com/gnu/docs/grep/grep_8.html для хорошей документации по используемому классу символов.
В моем примере адреса были окружены пробелами, что облегчало сопоставление. Если вы просматриваете журнал почтового сервера, например, вы можете добавить <>, чтобы он совпадал только с адресами:
egrep -ho "<[[:graph:]]+@[[:graph:]]+>"
@ Томас, @glowcoder и @oedo все правы. RFC, который определяет, как может выглядеть адрес электронной почты, довольно интересное чтение. (Я использовал GNU grep 2.9 выше, включен в Ubuntu).
Также ознакомьтесь с приведенной ниже версией zpea, она должна быть менее подходящей для триггера.