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
War es hilfreich?

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. :)

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top