我需要从像这样的字符串中提取电子邮件地址(我正在创建一个日志解析器):
<some text> from=someuser@somedomain.com, <some text>
egrep
(或grep -Eo
)。因此,只需在"from="
和","
之间提取字符串,因为日志的其他部分也包含电子邮件地址,例如to=
和etc
答案 0 :(得分:24)
使用grep -oP
:
s='<some text> from=someuser@somedomain.com, <some text>'
grep -oP '(?<=from=).*?(?=,)' <<< "$s"
someuser@somedomain.com
或者使用lookbehind
\K
grep -oP 'from=\K.*?(?=,)' <<< "$s"
someuser@somedomain.com
如果您的grep
不支持-P
(PCRE),请使用此sed:
sed 's/.*from=\(.*\),.*/\1/' <<< "$s"
someuser@somedomain.com
答案 1 :(得分:10)
尝试awk
echo '<text> from=someuser@somedomain.com, <text>' | awk -F[=,] '{print $2}'
此处$2
根据其位置可以是不同的数字。
答案 2 :(得分:2)
一个纯粹的bash解决方案,需要两个步骤去除前缀&amp;单独后缀(但可能运行得更快,因为没有子进程):
#!/bin/bash
orig='from=someuser@somedomain.com, <some text>'
one=${orig#*from=}
two=${one%,*}
printf "Result:\n"
printf "$orig\n"
printf "$one\n"
printf "$two\n"
输出:
Result:
from=someuser@somedomain.com, <some text>
someuser@somedomain.com, <some text>
someuser@somedomain.com
注意:
${var#*pattern}
使用从#
开始到$var
pattern
条
${var%pattern*}
使用%
末尾的$var
条,最多pattern
${var/pattern/replace}
完成(并留下replace
空白),但由于不支持完整的正则表达式(即无法使用^
或'$',因此更为棘手) ),所以你做不到(例如)/^from=//
,但是你可以在第一步${var/*from=/}
做,然后在第二步,做${var/,*/}
(当然,取决于你的数据) )。