【问题标题】:Using regex to obtain the first IP?使用正则表达式获取第一个 IP?
【发布时间】:2017-09-07 18:54:30
【问题描述】:

如何使用正则表达式从该数据中仅返回第一个 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。

演示:https://regex101.com/r/anONgm/2

【问题讨论】:

    标签: regex grep ip


    【解决方案1】:

    如果这个问题的措辞只是“我怎样才能从这个数据中只返回第一个 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。

    顺便说一句,使用一些在线工具验证正则表达式只是证明你有一个在该在线工具中工作的正则表达式。创建正则表达式以在其他工具中运行通常没有用处,因为它们都使用不同的正则表达式风格(例如 BRE、ERE 和 PCRE),并有自己的限制和/或扩展。

    【讨论】:

      【解决方案2】:

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

      dst=([\S]+)
      

      【讨论】:

      • 我怎样才能让它只返回第一个 dst=?这将返回它们。
      • 我不明白。这应该在索引 1 处返回 192.168.1.254。
      • 他返回了两个 IP,因为有两个位置可以找到 dst=(并且您的模式与它们都匹配)。 @Tod 你需要关闭 g 修饰符(它返回所有匹配而不是只返回第一个匹配)
      • @Tod 提供的答案会将 IP 捕获到一个组中,以便您可以通过这种方式访问​​它。否则(?<=dst=)(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\b 将起作用(您不需要所有的绒毛,但它会按照它的写入方式正确匹配 IP 地址)。它作为一种积极的后向检查,确保令牌之前的内容存在(但不捕获它)。
      • \s的否定是\S,不必写[^\s]
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-03-29
      • 1970-01-01
      • 2013-04-23
      • 2012-10-27
      • 2014-05-18
      • 1970-01-01
      • 2014-12-15
      相关资源
      最近更新 更多