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
È stato utile?

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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top