【问题标题】:Regex to find valid IP address using awk [duplicate]使用 awk 查找有效 IP 地址的正则表达式 [重复]
【发布时间】:2020-04-06 14:46:53
【问题描述】:

我获得了连接到网络的所有 IP 地址以及网络的字符串和名称,但我只想使用 awk regex

提取 IP

我试过了:

awk '{match($0,/[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+/); ip = substr($0,RSTART,RLENGTH); print ip}'

但它会打印 IP 地址以及一些数字和日期,比如说

2019-12-13 12
192.168.1.1
123.168.1.12
0.00012

但我只想要 IP 地址。

【问题讨论】:

  • . 匹配正则表达式中的任何内容。请改用\.
  • 很好,您已经向我们展示了您正在尝试的内容,始终建议您在问题中使用代码标签显示您的输入和预期输出示例。
  • 也许grep -o '[0-9]\+\.[0-9]\+\.[0-9]\+\.[0-9]\+'?

标签: regex awk


【解决方案1】:

就正则表达式而言,PCRE 兼容表达式(?:[12]?\d{1,2}\.){3}[12]?\d{1,2} 应该可以满足您的需求。它是更全面的 IP 正则表达式的简化版本,可以在 this question, 上找到答案,并且可以使用 demo. 进行测试

不幸的是,awk 的能力非常有限,并且不兼容 PCRE。我建议改用 perl,但如果你坚持使用 awk,下面的命令应该可以工作:

awk 'match($0, /[12]?[0-9]?[0-9]\.[12]?[0-9]?[0-9]\.[12]?[0-9]?[0-9]\.[12]?[0-9]?[0-9]/) {print substr($0, RSTART, RLENGTH)}'

这使用awk-兼容的正则表达式来匹配IP,并且是上述正则表达式的扩展形式。它只匹配并打印出 它找到的 IP,省略该行的其余部分。


在您编辑问题之前,您的原始正则表达式是 0-9]+.[0-9]+.[0-9]+.[0-9]+ - . 允许它匹配任何字符,这意味着连字符、空格和数字都是有效的匹配项。通过指定\.,正则表达式将与句点字符完全匹配。

【讨论】:

    【解决方案2】:

    说实话,我对 awk 命令一无所知,但作为一个优秀的正则表达式编写器,要提取 ip 地址,你可以使用这个优化的 exp:

    /^([0-9]{0,3}\.){3}[0-9]{1,3}$/g
    

    你可以在这里查看: IP address Regex test

    【讨论】:

      【解决方案3】:

      这样的?

      $ cat file
      172.27.1.256 # invalid ip
      2019-12-13 12
      192.168.1.1
      123.168.1.12
      0.00012
      299.288.299.333 # invalid ip
      
      $ grep -oE '((1?[0-9][0-9]?|2[0-4][0-9]|25[0-5])\.){3}((1?[0-9][0-9]?|2[0-4][0-9]|25[0-5]))\s+?$' file
      192.168.1.1
      123.168.1.12
      

      【讨论】:

        【解决方案4】:

        请您尝试以下操作。由于没有给出样品所以没有测试它。

        awk 'match($0,/[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+/){print substr($0,RSTART,RLENGTH)}' Input_file
        

        为什么 OP 的代码不起作用: 由于 OP 在正则表达式中提到了 .,它匹配任何字符而不是文字字符 .,这就是 OP 获得结果的原因这也不是IP。在上面的代码中,它通过\. 进行转义,这将使awk 知道要查找文字字符. 而不是任何字符。

        【讨论】:

        • 我试过用 \.也是,但我得到相同的结果
        • @Jamuna,请在您的问题中添加示例,然后告诉我?
        • @Jamuna,如果你的文件中有控制 M 字符,还要检查 1 件事,如果它们存在,请执行 cat -v Input_file,那么我们可能也需要删除它们
        • 暂定 +1 用于简单(r)正则表达式,因为它似乎满足 OP 的需求,但请注意,这将匹配无意义的 IP,例如 1234.5678.91011.1213
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2022-12-08
        • 2021-10-26
        • 1970-01-01
        • 2014-05-17
        • 2017-01-24
        • 2011-06-20
        相关资源
        最近更新 更多