Buscando expresiones regulares para extraer direcciones de correo electrónico de /etc/passwd

StackOverflow https://stackoverflow.com/questions/95305

  •  01-07-2019
  •  | 
  •  

Pregunta

La mayoría de mis usuarios tienen direcciones de correo electrónico asociadas con su perfil en /etc/passwd.Siempre están en el quinto campo, que puedo tomar, pero aparecen en diferentes lugares dentro de una lista separada por comas en el quinto campo.

¿Alguien puede darme un expresiones regulares para tomar solo la dirección de correo electrónico (delimitado por comas) de una línea en este archivo?(Usaré grep y sed desde un script bash)

Líneas de muestra del archivo:

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
¿Fue útil?

Solución

Qué pasa:

,([^@]+@[^,:]+)

Donde el grupo contiene la dirección de correo electrónico.

[Actualizado según el comentario de que la dirección no siempre termina con una coma]

Otros consejos

Una expresión regular de correo electrónico estándar debería funcionar bien:

http://regexlib.com/DisplayPatterns.aspx

También puedes probar el excelente: sitio web!

En realidad, este parece un trabajo perfecto para Awk.Ahora, como la mayoría de la gente, diré "No soy un experto en Awk" antes de continuar...

awk -F : '{print $5}' /etc/passwd

obtendría el quinto campo donde ':' es el separador de campo de /etc/passwd; probablemente sea el quinto campo que desea.

awk -F , '{print $1}'

obtendría el primer campo de la entrada estándar donde ',' estaba delimitado, por lo que

awk -F : '{print $5}' /etc/passwd | awk -F , '{print $1}'

obtendría el primer campo separado por comas (el campo Nombre) del quinto campo separado por dos puntos (¡el campo con todo ese tipo de información en él!) en su archivo /etc/passwd.

Ajuste la impresión $1 para obtener el campo con sus correos electrónicos.

Sin duda, hay una manera de hacer esto sin la tubería en Awk.Utilizo Awk para dividir campos en cosas y no mucho más.Lo encuentro confuso, y eso es de alguien que ama las expresiones regulares...

Por cierto, el quinto campo se conoce como campo SMOC.A veces se escribe GECOS.

sed -r -e "s/^.*[,:]([^,:]+@[^,:]+).*$/\1/g" /etc/passwd

Hará el truco

Busque todos los caracteres válidos del correo electrónico antes y después del signo @.Como:

[-A-z0-9.]+@[-A-z0-9.]+

La coincidencia codiciosa debería extraer todo lo que pueda y se detendrá en las comas o los dos puntos.

Sin embargo, comprueba qué caracteres son válidos en las direcciones de correo electrónico.He dejado algunos fuera (como +)

sed 's/,*:\/.*//;s/^.*://;s/.*,//' /etc/passwd
[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?

debería atrapar a la mayoría de los emials

¿Qué tal el estándar? 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])+)\])

Sí.Eso es todo.:)

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top