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



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

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

使用 grep -oP

s='<some text> from=someuser@somedomain.com, <some text>'
grep -oP '(?<=from=).*?(?=,)' <<< "$s"
someuser@somedomain.com

或者通过使用K来避免lookbehind

grep -oP 'from=K.*?(?=,)' <<< "$s"
someuser@somedomain.com

如果您的grep不支持-P (PCRE),请使用此 sed:

sed 's/.*from=(.*),.*/1/' <<< "$s"
someuser@somedomain.com

尝试awk

echo '<text> from=someuser@somedomain.com, <text>' | awk -F[=,] '{print $2}'

在这里,$2可以根据其位置使用不同的数字。

符号"(", ")"之间的单词示例:

echo "Linux Foundation Certified Engineer (LFCE-JP)" | awk -F[()] '{print $2}'
LFCE-JP
一个

纯粹的bash解决方案,需要两个步骤来分别去除前缀和后缀(但可能运行得更快,因为没有子进程):

#!/bin/bash
orig='from=someuser@somedomain.com, <some text>'
one=${orig#*from=}
two=${one%,*}
printf "Result:n"
printf "$orign"
printf "$onen"
printf "$twon"

输出:

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

相关内容

  • 没有找到相关文章

最新更新