Vous recherchez une expression régulière pour extraire les adresses électroniques de / etc / passwd

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

  •  01-07-2019
  •  | 
  •  

Question

La plupart de mes utilisateurs ont des adresses électroniques associées à leur profil dans / etc / passwd . Ils se trouvent toujours dans le cinquième champ, ce que je peux saisir, mais ils apparaissent à différents endroits dans une liste séparée par des virgules du cinquième champ.

Quelqu'un peut-il me donner une expression régulière pour saisir uniquement l'adresse de messagerie (délimitée par des virgules) dans une ligne de ce fichier? (Je vais utiliser grep et sed à partir d'un script bash)

Exemples de lignes du fichier:

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
Était-ce utile?

La solution

Qu'en est-il de:

  

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

Où le groupe contient l'adresse e-mail.

[Mis à jour en fonction des commentaires, cette adresse ne se termine pas toujours par une virgule]

Autres conseils

Une expression régulière standard dans un courrier électronique devrait fonctionner correctement:

http://regexlib.com/DisplayPatterns.aspx

Vous pouvez également essayer l'excellent: site Web !

En fait, cela semble être un travail parfait pour Awk. Maintenant, comme la plupart des gens, je dirai "je ne suis pas un expert en Awk". avant de continuer ...

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

obtiendrait le cinquième champ où ':' est le séparateur de champs de / etc / passwd - c'est probablement le cinquième champ que vous voulez.

awk -F , '{print $1}'

obtiendrait le premier champ à partir de l'entrée standard où ',' était-il délimiteur de manière

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

obtiendrait le premier champ séparé par des virgules (le champ Nom) du cinquième champ séparé par des points-virgules (le champ contenant toutes ces informations erronées!) dans votre fichier / etc / passwd.

Ajustez l’impression $ 1 pour obtenir le champ contenant vos courriels.

Il est sans doute possible de le faire sans le tuyau à Awk. J'utilise Awk pour séparer les champs et pas grand chose d'autre. Je trouve cela déroutant, et cela vient de quelqu'un qui aime les expressions régulières ...

BTW Le cinquième champ est appelé champ GCOS. Parfois orthographié GECOS.

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

Fera le tour

Recherchez tous les caractères valides pour l’e-mail avant et après le signe @. J'aime:

  

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

L'appariement glouton doit faire son possible et s'arrête aux virgules ou aux deux points.

Vérifiez quels caractères sont valides dans les adresses électroniques. J'en ai laissé de côté (comme +)

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])?

devrait attraper la plupart des émials

Qu'en est-il de la norme 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])+)\])

Oui. C'est tout. :)

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top