Ищете регулярное выражение для извлечения адресов электронной почты из / etc / passwd - PullRequest
1 голос
/ 18 сентября 2008

Большинство моих пользователей имеют адреса электронной почты, связанные с их профилем в /etc/passwd. Они всегда находятся в 5-м поле, которое я могу взять, но они появляются в разных местах в списке через запятую в 5-м поле.

Может ли кто-нибудь дать мне регулярное выражение , чтобы получить только адрес электронной почты (разделенный запятыми) из строки в этом файле? (Я буду использовать grep и sed из bash-скрипта)

Пример строки из файла:

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

Ответы [ 9 ]

7 голосов
/ 18 сентября 2008

А как же:

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

Где группа содержит адрес электронной почты.

[Обновлено на основе комментария, что адрес не всегда завершается запятой]

6 голосов
/ 18 сентября 2008

Стандартное регулярное выражение электронной почты должно работать нормально:

http://regexlib.com/DisplayPatterns.aspx

Вы также можете попробовать отличный: веб-сайт !

5 голосов
/ 18 сентября 2008

На самом деле, это выглядит как идеальная работа для Awk. Теперь, как и большинство людей, я скажу: «Я не специалист по Awk», прежде чем продолжить ...

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

получит 5-е поле, где ':' - это разделитель полей из / etc / passwd - это, вероятно, 5-е поле, которое вы хотите.

awk -F , '{print $1}'

получит 1-е поле из стандартного ввода, где ',' он был разделителем, поэтому

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

получит первое разделенное запятыми поле (поле «Имя») из пятого разделенного двоеточиями поля (поля со всеми подобными словами!) В вашем файле / etc / passwd.

Отрегулируйте печать $ 1, чтобы получить поле с вашими электронными письмами в нем.

Несомненно, в Awk есть возможность сделать это без трубы. Я использую Awk для разделения полей в вещах и не так много другого. Я нахожу это запутанным, и это от кого-то, кто любит регулярные выражения ...

1 голос
/ 18 сентября 2008
sed -r -e "s/^.*[,:]([^,:]+@[^,:]+).*$/\1/g" /etc/passwd

сделает свое дело

1 голос
/ 18 сентября 2008

Поиск всех действительных символов электронной почты до и после знака @. Как:

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

Жадное сопоставление должно тянуть все, что может, и оно остановится на запятых или двоеточиях.

Проверьте, какие символы действительны в адресах электронной почты. Я оставил некоторые (как +)

1 голос
/ 18 сентября 2008

Кстати. Пятое поле называется полем ГСНК. Иногда пишется GECOS.

0 голосов
/ 19 марта 2010
sed 's/,*:\/.*//;s/^.*://;s/.*,//' /etc/passwd
0 голосов
/ 19 сентября 2008

Как насчет стандарта 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])+)\])

Да. Вот и все. :)

0 голосов
/ 18 сентября 2008
[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?

должен поймать большинство эмилов

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...