2

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

sudo ngrep -W byline | grep...

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

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

应该变成:

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

这有可能吗?

4

3 回答 3

1

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

$ echo "fwef-$*nVrtmp://Ggdggragravrv.com/lolwtf.mp5skill0rz%%&:/getr4kt..Glub" | grep -oP 'rtmp.*?(?=\.\.)'
rtmp://Ggdggragravrv.com/lolwtf.mp5skill0rz%%&:/getr4kt
于 2015-01-12T18:18:17.413 回答
0

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

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

 (?: rtmp | \.\. )
 (?:
      (?! rtmp | \.\. )
      . 
 )*
 (?= \.\. | rtmp )
于 2015-01-12T18:27:17.260 回答
0

如果您没有可用的 perl(-compatible) 正则表达式,您可以使用普通 egrep 进行匹配。但是,您必须找出终止表达式的逆。例如,如果一个字符串在 之前终止..,那么它匹配任何不包含 的序列..,这意味着它匹配任何不是句点的字符,或者一个句点后跟一个不是句点的字符。这与说“一个可选的句点后跟一个非句点”是一样的:

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

如果终止字符串是单个字符,那就更容易了:只需匹配除终止符之外的任何内容。例如,要匹配最多但不包括 a 的字符串?

$ echo "......mp3:mp3/19695c8f0fcbe45521908c3ec60f8f96554a523e?Expires=1421093669&..." |
> grep -oE 'mp3/[^?]*'
mp3/19695c8f0fcbe45521908c3ec60f8f96554a523e
于 2015-01-12T22:13:42.040 回答