Cercando regex per estrarre indirizzi email da /etc/passwd
Domanda
La maggior parte dei miei utenti hanno indirizzi e-mail associati con il loro profilo /etc/passwd
.Sono sempre in 5 ° campo, che posso prendere, ma appaiono in luoghi diversi all'interno di un elenco separato da virgole nel 5 ° settore.
Qualcuno può darmi una regex di prendere solo l'indirizzo e-mail (delimitata da virgole) da una riga di questo file?(Sarò l'uso di grep e sed, da uno script bash)
Campione righe dal file:
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
Soluzione
Che dire:
,([^@]+@[^,:]+)
In cui il gruppo contiene l'indirizzo e-mail.
[Aggiornato in base al commento di indirizzo che non sempre avere terminato da una virgola]
Altri suggerimenti
Una e-mail standard espressione regolare dovrebbe funzionare bene:
http://regexlib.com/DisplayPatterns.aspx
Si può anche provare l'eccellente: sito web!
In realtà, questo sembra un lavoro perfetto per Awk.Ora, come la maggior parte delle persone mi dicono "io non sono un esperto in Awk" prima di procedere...
awk -F : '{print $5}' /etc/passwd
vorresti ottenere il 5 ° campo dove ':' è il separatore di campo di /etc/passwd - è probabilmente il 5 ° campo si vogliono.
awk -F , '{print $1}'
otterrebbe il 1 ° campo di input standard dove ',' stato lui delimimter così
awk -F : '{print $5}' /etc/passwd | awk -F , '{print $1}'
vorresti ottenere i primi separati da virgola campo (il campo Nome) dalla quinta, separate da campo (il campo con tutto quel genere di spazzatura in esso!) nel tuo file /etc/passwd.
Regolare il print $1 per ottenere il campo con la vostra e-mail in esso.
Senza dubbio non vi è via per fare questo senza il tubo in Awk.Io uso Awk per dividere i campi nelle cose e non molto altro.Io la trovo confusa, e che da parte di qualcuno che ama le espressioni regolari...
BTW Il quinto campo è conosciuto come il GCOS campo.A volte farro GECOS.
sed -r -e "s/^.*[,:]([^,:]+@[^,:]+).*$/\1/g" /etc/passwd
Farà il trucco
Ricerca per tutti e-mail valido-caratteri prima e dopo il simbolo@.Come:
[-A-z0-9.]+@[-A-z0-9.]+
Avidi di corrispondenza deve tirare tutto il possibile, e si fermerà presso la virgola o i due punti.
Controllare che i caratteri siano validi gli indirizzi e-mail, però.Ho lasciato fuori alcuni (come +)
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])?
dovrebbe prendere la maggior parte emials
Come circa gli 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.Che è.:)