正则表达式 - 搜索直到出现特定字符串

时间:2015-01-12 18:15:47

标签: regex linux grep rtmp ngrep

我使用ngrepgrep从网络流量中提取一些字符串:

sudo ngrep -W byline | grep...

现在我想让grep搜索一个字符串并从第一个字母开始复制,直到出现一些不同的字符串。字符串为rtmp.. 例如:

"fwef-$*nVrtmp://Ggdggragravrv.com/lolwtf.mp5skill0rz%%&:/getr4kt..Glub"

应该变成:

"rtmp://Ggdggragravrv.com/lolwtf.mp5skill0rz%%&:/getr4kt"

这有可能吗?

3 个答案:

答案 0 :(得分:1)

您可以尝试以下grep命令,该命令使用基于positive lookahead的正则表达式

$ echo "fwef-$*nVrtmp://Ggdggragravrv.com/lolwtf.mp5skill0rz%%&:/getr4kt..Glub" | grep -oP 'rtmp.*?(?=\.\.)'
rtmp://Ggdggragravrv.com/lolwtf.mp5skill0rz%%&:/getr4kt

答案 1 :(得分:0)

这包括rtmp to just before ..
.. to just before rtmp。
rtmp to just before rtmp,
.. to just before ..

 # (?:rtmp|\.\.)(?:(?!rtmp|\.\.).)*(?=\.\.|rtmp)

 (?: rtmp | \.\. )
 (?:
      (?! rtmp | \.\. )
      . 
 )*
 (?= \.\. | rtmp )

答案 2 :(得分:0)

如果您没有可用的perl(兼容)正则表达式,则可以与普通的egrep进行匹配。但是,您必须弄清楚终止表达式的反转。例如,如果字符串在..之前终止,则它匹配任何不包含..的序列,这意味着它匹配任何不是句点的字符,或者句点后跟字符这不是一个时期。这与说“非选择时段之后的可选时段”相同:

$ echo "fwef-$*nVrtmp://Ggdggragravrv.com/lolwtf.mp5skill0rz%%&:/getr4kt..Glub" |
> grep -oE 'rtmp:([.]?[^.])*'
rtmp://Ggdggragravrv.com/lolwtf.mp5skill0rz%%&:/getr4kt

如果终止字符串是单个字符,那就更容易:只匹配终结符以外的任何内容。例如,要匹配字符串,但不包括?

$ echo "......mp3:mp3/19695c8f0fcbe45521908c3ec60f8f96554a523e?Expires=1421093669&..." |
> grep -oE 'mp3/[^?]*'
mp3/19695c8f0fcbe45521908c3ec60f8f96554a523e