【问题标题】:Regex to match IP addresses but ignore localhost正则表达式匹配 IP 地址但忽略 localhost
【发布时间】:2017-11-08 15:59:21
【问题描述】:

所以我有这个脚本,它对分配给我的操作系统 (GNU/Linux) 的 IP 执行某些操作,这些 IP 是通过运行 ifconfig 获得的。它工作正常,但是,我想知道是否可以在同一个正则表达式中过滤掉环回/本地主机 IP(127.0.0.1)[我假设集群中的每个服务器都说 IP,我不需要对它做任何事情在我的脚本中。]

我的脚本使用的是:

ifconfig | awk '/(([0-9]{1,3}\.){3})/ {print}' |sed -e "s/.*addr\://g" -e "s/\s.*//g" 

我得到如下结果:

> ifconfig | awk '/(([0-9]{1,3}\.){3})/ {print}' |sed -e "s/.*addr\://g" -e "s/\s.*//g"
172.16.0.1
127.0.0.1

我知道这可能是一个愚蠢的问题,但我可以在我的第一个正则表达式中过滤任何以 127 开头的 IP 吗?

我可以尝试将 awk 更改为 grep,类似于:

> ifconfig |egrep -o "addr\:(([0-9]{1,3}\.){3}[0-9]{1,3})" |sed -e "s/.*addr\://g"

但如果我在开始时尝试否定 (?!127),bash 会将其解释为 !127,这只会让我从历史中丢掉一些东西。

我的意思是,我可以像 grep -v "127.0.0.1" 这样在 oneliner 的末尾运行另一个 grep,但我只是想避免 grep 已经 grep 的东西。并不是说这有什么问题,我想只是想了解更多并提高效率。

【问题讨论】:

    标签: linux bash awk grep regex-negation


    【解决方案1】:

    只有一个没有 sed 或 awk 的 grep:

    # ip a|grep -oP "inet \K[0-9.]*(?=.*[^ ][^l][^o]$)"
    192.168.1.31
    172.16.5.31
    

    【讨论】:

    • 那就更好了
    • 澄清一下,基本上你只是在过滤以lo 结尾的内容,对吗?如果您取出[^l]它也可以工作,因为您不太可能有一个以字母结尾的界面。但事实上,它确实有效。
    【解决方案2】:

    您可以只添加一个子句来匹配127.0.0.1,并通过添加next 来排除它,如下所示。这样Awk 会忽略对包含此模式的行执行任何操作。

    .. | awk '/127.0.0.1/{next}/(([0-9]{1,3}\.){3})/{print}' | ..
    

    【讨论】:

    • 耶!我知道这比我想象的要容易。谢谢老大
    猜你喜欢
    • 1970-01-01
    • 2012-04-27
    • 1970-01-01
    • 2011-08-17
    • 2011-08-27
    • 2012-05-17
    • 2011-03-01
    • 2014-05-17
    • 1970-01-01
    相关资源
    最近更新 更多