Regex 使用正则表达式获取第一个IP?

Regex 使用正则表达式获取第一个IP?,regex,grep,ip,Regex,Grep,Ip,如何使用regex仅从该数据返回第一个dst IP ipv4 2 udp 17 34 src=192.168.1.76 dst=192.168.1.254 sport=198 dport=53 packets=1 bytes=65 src=192.168.1.254 dst=192.168.1.76 sport=53 dport=198 packets=1 bytes=105 mark=0 use=2 通缉结果:192.168.1.254 我所尝试的: dst=([0-9]{

如何使用regex仅从该数据返回第一个dst IP

ipv4     2 udp      17 34 src=192.168.1.76 dst=192.168.1.254 sport=198 dport=53 packets=1 bytes=65 src=192.168.1.254 dst=192.168.1.76 sport=53 dport=198 packets=1 bytes=105 mark=0 use=2
通缉结果:192.168.1.254

我所尝试的:

dst=([0-9]{1,3}\.){3}[0-9]{1,3}
这将返回第一个和第二个dst IP


演示:

您可以尝试使用所有字符,直到出现空白。检查这个

dst=([\S]+)

您可以尝试使用所有字符,直到出现空白。检查这个

dst=([\S]+)

如果这个问题的措辞仅为“如何从该数据中仅返回第一个dst IP?”,那么答案将是GNU awk:

$ awk 'match($0,/dst=([^ ]+)/,a){print a[1]}' file
192.168.1.254
或使用任何awk:

$ awk 'match($0,/dst=[^ ]+/){print substr($0,RSTART+4,RLENGTH-4)}' file
192.168.1.254
这将适用于任何UNIX机器上任何shell中的任何sed


顺便说一句,使用一些在线工具验证regexp只能证明您有一个在该在线工具中工作的regexp。一般来说,创建要在其他工具中运行的regexp是没有用的,因为它们都使用不同的regexp风格(例如BRE vs ERE vs PCRE),并有自己的限制和/或扩展。

如果这个问题的措辞只是“如何从该数据返回第一个dst IP?”,那么GNU awk的答案就是这样:

$ awk 'match($0,/dst=([^ ]+)/,a){print a[1]}' file
192.168.1.254
或使用任何awk:

$ awk 'match($0,/dst=[^ ]+/){print substr($0,RSTART+4,RLENGTH-4)}' file
192.168.1.254
这将适用于任何UNIX机器上任何shell中的任何sed


顺便说一句,使用一些在线工具验证regexp只能证明您有一个在该在线工具中工作的regexp。一般来说,创建要在其他工具中运行的regexp是没有用的,因为它们都使用不同的regexp风格(例如BRE与ERE与PCRE),并有各自的限制和/或扩展。

如何使其仅返回第一个dst=?这两个都返回了,我不明白。这应该在索引1处返回192.168.1.254。他得到两个返回的IP,因为有两个位置可以找到
dst=
(并且您的模式匹配这两个位置)@Tod您需要关闭
g
修饰符(它返回所有匹配项,而不是只返回第一个匹配项)@Tod提供的答案将IP捕获到一个组中,以便您可以通过这种方式访问它。否则,
\s
的否定为
\s
,不需要写入
[^\s]
。我怎样才能让它只返回第一个dst=?这会返回它们两个。我不明白。这应该在索引1处返回192.168.1.254。他返回了两个IP,因为有两个位置可以找到
dst=
(并且你的模式与它们都匹配)。@Tod你需要关闭
g
修饰符(返回所有匹配项,而不是只返回第一个匹配项)@Tod提供的答案将IP捕获到一个组中,以便您可以通过这种方式访问它。否则
\s
的否定是
\s
,不必写入
[^\s]