Ищете регулярное выражение для извлечения адресов электронной почты из /etc /passwd
Вопрос
У большинства моих пользователей есть адреса электронной почты, связанные с их профилем в /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
Решение
О чем:
,([^@]+@[^,:]+)
Где группа содержит адрес электронной почты.
[Обновлено на основе комментария о том, что адрес не всегда заканчивается запятой]
Другие советы
Стандартное регулярное выражение электронной почты должно работать нормально:
http://regexlib.com/DisplayPatterns.aspx
Вы также можете попробовать отличные: Веб-сайт!
На самом деле, это выглядит как идеальная работа для 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 для разделения полей в вещах и не более того.Я нахожу это сбивающим с толку, и это от кого-то, кто любит регулярные выражения...
Кстати, пятое поле известно как поле GCOS.Иногда пишется ГЕКОС из полбы.
sed -r -e "s/^.*[,:]([^,:]+@[^,:]+).*$/\1/g" /etc/passwd
Сделает свое дело
Выполните поиск по всем допустимым символам электронной почты до и после знака @.Нравится:
[-A-z0-9.]+@[-A-z0-9.]+
Жадное сопоставление должно включать все, что только возможно, и останавливаться на запятых или двоеточиях.
Однако проверьте, какие символы допустимы в адресах электронной почты.Я кое-что пропустил (например, +)
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])?
должно поймать большинство электронных писем
Как насчет стандарта 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])+)\])
Ага.Вот и все.:)