Buscando expresiones regulares para extraer direcciones de correo electrónico de /etc/passwd
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
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.:)