Pergunta

A maioria dos meus usuários não os endereços de e-mail associado ao seu perfil no /etc/passwd. Eles estão sempre na 5ª campo, o que eu posso pegar, mas eles aparecem em diferentes lugares dentro de uma lista separada por vírgula na quinta campo.

Alguém pode me dar uma regex para pegar apenas o endereço de e-mail (delimeted por vírgula) a partir de uma linha neste arquivo? (Eu vou estar usando grep e sed de um script bash)

linhas de amostra de arquivo:

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
Foi útil?

Solução

E:

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

Quando o grupo contém o endereço de e-mail.

[Atualizado com base em comentário que o endereço nem sempre se denunciado por uma vírgula]

Outras dicas

Um e-mail padrão expressão regular deve funcionar bem:

http://regexlib.com/DisplayPatterns.aspx

Você também pode experimentar a excelente: website

Na verdade, isto parece um trabalho perfeito para Awk. Agora, como a maioria das pessoas que vai dizer "Não sou especialista em Awk" antes de prosseguir ...

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

iria receber a 5ª campo onde ':' é o separador de campos de / etc / passwd - é provavelmente o 5º campo que você está querendo.

awk -F , '{print $1}'

receberia o 1º campo da entrada padrão, onde '', foi ele delimimter assim

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

iria receber a primeira vírgula separados campo (o campo Nome) a partir do quinto cólon campo separado (o campo com tudo o que tipo de cruft nele!) Em seu arquivo / etc / passwd.

Ajustar o print $ 1 para obter o campo com seus e-mails na mesma.

Sem dúvida existe longe de fazer isso sem o tubo em Awk. Eu uso Awk para dividir a campos em coisas e não muito mais. Acho que é confuso, e isso é de alguém que ama expressões regulares ...

BTW O quinto campo é conhecido como o campo GCOS. Às vezes GECOS escrito.

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

irá fazer o truque

Pesquise todos os e-mail válido-personagens antes e depois do sinal @. Como:

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

correspondência Greedy deve puxar em tudo o que pode, e vai parar nas vírgulas ou dois pontos.

Verifique quais os caracteres são válidos em endereços de e-mail, no entanto. Eu deixei alguns fora (como +)

sed 's/,*:\/.*//;s/^.*://;s/.*,//' /etc/passwd
gêneros tag codice prep> deve pegar a maioria dos emials

Como sobre o padrão 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])+)\])

Sim. É isso aí. :)

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top