С sed
:
$ echo "db dump: someusername ::: kRW...0fPc ::: $2a$10$...aucvkDt86 ::: joesmith@gmail.com"|sed 's/.*::: //' joesmith@gmail.com
С awk
:
$ echo "db dump: someusername ::: kRW...0fPc ::: $2a$10$...aucvkDt86 ::: joesmith@gmail.com"|awk '{print $NF}'
РЕДАКТИРОВАТЬ: Учитывая новую информацию в вашем комментарии - довольно сложно сделать то, что вы спрашиваете безлюбая закономерность.Проверьте раздел Синтаксис здесь:
Стандарт говорит, что, например, 1$%3{C}@example.com
является действительным адресом электронной почты (хотите верьте, хотите нет).Вы даже можете процитировать его (пример, приведенный в статье - John Doe@example.com
).Таким образом, следуя стандарту, почти невозможно распознать действительный адрес электронной почты.
Если вы ограничите свой поиск, вы можете, например, извлечь строки, содержащие @
, выполнив сначала:
cat your-file.txt|grep @
, то сделайте некоторые из вышеперечисленных.Вы даже можете сделать что-то вроде этого:
$ echo "garbage John.Doe123@example.com garbage"|sed 's/[^@]* \([a-zA-Z0-9.]*@[^ ]*\).*/\1/'
John.Doe123@example.com
Обратите внимание, что вышеприведенное работает при следующих допущениях:
- Перед адресом электронной почты есть пробел
- Тамнет пробелов в самом адресе электронной почты
- В строке один адрес электронной почты (фактически он получит только первый, поэтому может работать более чем с одним)
local-part
(все до @
) содержит только буквы (строчные или прописные), цифры и точку
Расширьте набор символов ([a-zA-Z0-9.]
), так как вы хотите сделать его менее ограничительным- Например, вы можете сделать [a-zA-Z0-9.-_]
, чтобы включить -
и _
.