Suche nach regex E-Mail-Adressen zu extrahieren von / etc / passwd
Frage
Die meisten meiner Benutzer haben E-Mail-Adressen mit ihrem Profil in /etc/passwd
verbunden. Sie sind immer im 5. Feld, das ich greifen kann, aber sie erscheinen an verschiedenen Stellen innerhalb einer durch Kommata getrennte Liste im 5. Feld.
Kann jemand geben Sie mir eine regex nur die E-Mail-Adresse greifen (delimeted durch Komma) von einer Zeile in dieser Datei? (Ich werde von einem Bash-Skript grep und sed verwenden)
Beispielzeilen aus der Datei:
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
Lösung
Was ist mit:
([^ @] + @ [^ ,:] +)
Wenn die Gruppe der E-Mail-Adresse enthält.
[aktualisiert, basierend auf Kommentar, dass Adresse nicht immer durch ein Komma beendet bekommen]
Andere Tipps
Ein Standard-E-Mail regulärer Ausdruck sollte funktionieren:
http://regexlib.com/DisplayPatterns.aspx
Sie können auch die hervorragende ausprobieren: Website
Eigentlich sieht dies wie ein perfekter Job für awk. Nun, wie die meisten Leute werde ich sagen: „Ich bin kein Experte in Awk“, bevor Sie fortfahren ...
awk -F : '{print $5}' /etc/passwd
würde das fünfte Feld, wo ‚:‘ ist das Feldtrenn von / etc / passwd - es ist wahrscheinlich das fünfte Feld, das Sie wollen.
awk -F , '{print $1}'
würde das erste Feld von der Standardeingabe, wo ‚‘ war er delimimter so
awk -F : '{print $5}' /etc/passwd | awk -F , '{print $1}'
würde das erste Komma getrennt Feld (das Feld Namen) aus dem fünften Doppelpunkt getrennt Feld bekommen (das Feld mit allen dieser Art von cruft drin!) In / etc / passwd-Datei.
Passen Sie den Druck 1 $ das Feld mit Ihren E-Mail in ihr zu erhalten.
Ohne Zweifel gibt es weg dies in Awk ohne das Rohr zu tun. Ich benutze Awk für Felder in Sachen Aufspalten und sonst nicht viel. Ich finde es verwirrend, und das ist von jemandem, die reguläre Ausdrücke liebt ...
BTW Das bekannte fünfte Feld als GCOS Feld. Manchmal GECOS geschrieben.
sed -r -e "s/^.*[,:]([^,:]+@[^,:]+).*$/\1/g" /etc/passwd
Wird der Trick
Suchen Sie alle E-Mail-valid-Zeichen vor und nach dem @ -Zeichen. Wie:
[-. A-z0-9 ] + @ [-. A-z0-9 ] +
Greedy Matching in allem ziehen sollte es kann, und es wird an den Kommas oder Doppelpunkte zu stoppen.
Überprüfen Sie, welche Zeichen in E-Mail-Adressen gültig sind, though. Ich habe einige aus nach links (wie +)
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])?
should catch most emials
How about the standard 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])+)\])
Yep. That's it. :)