recursive files linux grep

linux - files - Usando grep para encontrar todos los correos electrónicos



ls grep (7)

Aquí hay otro ejemplo.

grep -Eiorh ''([[:alnum:]_.-]+@[[:alnum:]_.-]+?/.[[:alpha:].]{2,6})'' "$@" * | sort | uniq > emails.txt

Esta variante funciona con 3 dominios de nivel.

¿Cómo construir correctamente la expresión regular para el programa linux "grep", para encontrar todos los correos electrónicos en el directorio say / etc? Actualmente, mi script está siguiendo:

grep -srhw "[[:alnum:]]*@[[:alnum:]]*" /etc

Funciona bien, puede ver algunos de los correos electrónicos, pero cuando lo modifico, para detectar uno o más caracteres antes y después del signo "@" ...

grep -srhw "[[:alnum:]]+@[[:alnum:]]+" /etc

.. deja de funcionar en absoluto

Además, no detecta los correos electrónicos de la forma "[email protected]"

Ayuda !


Este recursivo funciona muy bien para mí:

grep -rIhEo "/b[a-zA-Z0-9.-]+@[a-zA-Z0-9.-]+/.[a-zA-Z0-9.-]+/b" /etc/*


He usado este para filtrar la dirección de correo electrónico identificada con el símbolo ''at'' y aislada por espacios en blanco dentro de un texto:

egrep -o "[^[:space:]]+@[^[:space:]]+" | tr -d "<>"

Por supuesto, puedes usar grep -E en lugar de egrep (grep extendido). Tenga en cuenta que el comando tr se usa para eliminar delimitadores de correo electrónico típicos.


Modifiqué su expresión regular para incluir puntuación (como.-_ Etc) cambiándola a

egrep -ho "[[:graph:]]+@[[:graph:]]+"

Esto todavía está bastante limpio y coincide ... bueno, casi cualquier cosa que tenga una @, por supuesto. También dominios de 3er nivel, también direcciones con ''%'' o ''+'' en ellos. Consulte http://www.delorie.com/gnu/docs/grep/grep_8.html para obtener una buena documentación sobre la clase de caracteres utilizada.

En mi ejemplo, las direcciones estaban rodeadas por espacios en blanco, lo que hacía que la comparación fuera bastante fácil. Si, por ejemplo, pasa por un registro del servidor de correo, puede agregar <> para que coincida solo con las direcciones:

egrep -ho "<[[:graph:]]+@[[:graph:]]+>"

@thomas, @glowcoder y @oedo todos tienen razón. El RFC que define cómo puede verse una dirección de correo electrónico es una lectura bastante divertida. (He estado usando GNU grep 2.9 arriba, incluido en Ubuntu).

También revisa la versión de zpea a continuación, debería ser un emparejador menos desencadenante.


Solo quería mencionar que una pequeña variación de esto funciona muy bien para captar menciones de cosas como los tweets de Twitter:

grep -Eiorh ''(@[[:alnum:]_.-]+)'' "$@" * | sort | uniq -c


grep -E -o -r "[A-Za-z0-9][A-Za-z0-9._%+-]+@[A-Za-z0-9][A-Za-z0-9.-]+/.[A-Za-z]{2,6}" /etc

Esto está adaptado de una respuesta que no es mía originalmente, pero lo encontré muy útil. Es de aquí:

http://www.shellhacks.com/en/RegEx-Find-Email-Addresses-in-a-File-using-Grep

Ellos sugieren:

grep -E -o -r "/b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+/.[A-Za-z]{2,6}/b" /etc

Pero tiene ciertos falsos positivos, como ''+ person .. @ example.com'' o ''person @ .. com'', y las restricciones de espacio en blanco faltan cosas como "mailto: [email protected]" (no técnicamente un correo electrónico, pero contiene uno); Así que lo pellizqué un poco.

(Haz lo que quieras con las opciones de grep, no las conozco muy bien)


grep requiere que se escape la mayoría de los caracteres especiales de expresiones regulares, incluido + . Querrás hacer uno de estos dos:

grep -srhw "[[:alnum:]]/+@[[:alnum:]]/+" /etc egrep -srhw "[[:alnum:]]+@[[:alnum:]]+" /etc