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

StackOverflow https://stackoverflow.com/questions/95305

  •  01-07-2019
  •  | 
  •  

Вопрос

У большинства моих пользователей есть адреса электронной почты, связанные с их профилем в /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])+)\])

Ага.Вот и все.:)

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top