正则表达式匹配IP地址但忽略localhost

时间:2017-11-08 15:59:21

标签: linux bash awk grep regex-negation

所以我有这个脚本,它通过运行ifconfig来分配给我的操作系统(GNU / Linux)的IP。它工作正常,但是,我想知道我是否可以在相同的正则表达式中过滤掉loopback / localhost 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吗?

我可以尝试更改grek的awk,例如:

> 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,但我只是想避免greping已经greped的东西。我觉得这并不是什么问题,只是想要了解更多,更有效率。

2 个答案:

答案 0 :(得分:1)

您只需添加一个与127.0.0.1匹配的子句,然后通过添加next将其排除,如下所示。这样Awk忽略对包含此模式的行执行任何操作。

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

答案 1 :(得分:1)

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

['NTE_BAD_PROV_TYPE',
  '',
  'Invalid provider type specified.',
  'More data is avaiable on bla bla.',
  '0x80090014']