使用grep在两个特定单词/字符之间获取字符串的模式

时间:2014-01-12 17:29:48

标签: regex bash grep

我需要从像这样的字符串中提取电子邮件地址(我正在创建一个日志解析器): <some text> from=someuser@somedomain.com, <some text>

egrep(或grep -Eo)。因此,只需在"from="","之间提取字符串,因为日志的其他部分也包含电子邮件地址,例如to=etc

3 个答案:

答案 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/,*/}(当然,取决于你的数据) )。
  • 另见:http://www.tldp.org/LDP/abs/html/parameter-substitution.html