Procurando por regex para endereços de e-mail extrato de / etc / passwd
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
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
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í. :)