grep 查找 IP 范围?

grep 查找 IP 范围?

在本地 IP 地址为 10.0.0.159 的 RHEL 7 机器上,以下命令打印出 IP 10.0.0.159

$ echo "$(ifconfig eth0 | grep -Eo 'inet (addr:)?([0-9]*\.){3}[0-9]*' | \
   grep -Eo '([0-9]*\.){3}[0-9]*' | grep -v '127.0.0.1')""(rw,sync)" 

为了打印出“10.0.0.0/8”,命令必须更改为什么?

答案1

笔记: ifconfig是一个已弃用的 cmd。你应该使用cmds。在 iproute2 包中。下面我展示了如何使用ip替换工具来完成您想要的事情。


ifconfig我建议使用命令而不是这样做ip

IP网段

此表单以 CIDR 表示法显示 IP 地址:

$ ip addr list eth0 | awk '/inet.*brd/ {print $2}'
10.0.2.15/24

-or-

$ ip a l eth0 | awk '/inet.*brd/ {print $2}'
10.0.2.15/24

网络网段

此表单以 CIDR 表示法显示网络地址:

$ ip route show | awk '/eth0.*scope/ {print $1}'
10.0.2.0/24

伊普计算

还可以使用该ipcalc命令操作上述地址来计算其他格式。例如:

$ ipcalc -n $(ip a l eth0 | awk '/inet.*brd/ {print $2}')
NETWORK=10.0.2.0

$ ipcalc -p $(ip a l eth0 | awk '/inet.*brd/ {print $2}')
PREFIX=24

ipcalc可以使用它更简单地形成您想要的任何变体,而不必执行大量sed&awk来解析通常过于复杂的文本。

答案2

要更改命令行以执行您想要的操作,首先您需要了解它在做什么。这里有一个分析:

echo "$(<something>)""(rw,sync)" 

将运行something并将其作为您的echo.其他一切都是要echo编辑的普通文本。

ifconfig eth0

获取网络信息。

grep -Eo 'inet (addr:)?([0-9]*\.){3}[0-9]*' 

隔离系统中的多个 IP。例如,-E告诉 grep 使用正则表达式,这就是为什么您可以使用它来将所有数字匹配在一起。告诉 grep 仅输出与正则表达式匹配的部分,而不是像默认情况下那样输出与 grep 条件匹配的整行。因此,如果输入行是,它只会输出,而忽略和部分。[0-9]*-oinet addr:10.0.0.159 Bcast:10.0.0.255 Mask:255.255.255.0inet addr:10.0.0.159BcastMask

grep -Eo  '([0-9]*\.){3}[0-9]*' 

这与上面完全相同,只是没有 label inet addr,这意味着您要专门隔离 IP 并删除标签。最后,

grep -v '127.0.0.1'

正在从输出列表中删除该 IP,因为您不关心环回 IP。


正如您所看到的,您的命令正在获取输出ifconfig并过滤信息,仅隔离您想要的信息。它不进行任何计算或信息处理。但你希望它打印的是子网和掩码,这些是 .net 没有显式显示的信息ifconfig。换句话说,你不能只是以不同的方式过滤掉一些东西来得到你想要的东西。您将必须使用Mask行末尾的字段进行一些处理和一些计算。总之,你不能“改变命令来打印出你想要的东西”。您必须创建一个完全不同的命令。

slm 的答案使用类似的技术(过滤掉信息以仅保留您想要的信息),但将输入更改为包含您需要的信息的命令。 :-) 如果您没有一个可以准确输出您想要的内容的命令,并且对其进行一些处理是您唯一的选择,那么这里有一组丑陋的ifs ,您可以将其用作将来的示例或基础。它使用 slm 的第一个解决方案,并假设您的掩码始终为 8、16 或 24。

ip a l eth1 | awk '/inet.*brd/ {split($2,add,"/");split(add[1],ip,".");if(add[2]<=24){ip[4]=0} if(add[2]<=16){ip[3]=0} if(add[2]<=8){ip[2]=0} print ip[1]"."ip[2]"."ip[3]"."ip[4]"/"add[2];}'

此命令将输出拆分为ipress add(10.0.0.159) 和 mask (8)。然后它将 IP 分成 4 个数字。然后它根据掩码将数字设置为零。但它不是按位的,这意味着它只会处理掩码 8、16 和 24,因为那是我硬编码的。 ;)

我希望您能更多地了解您手头的工具。 ^_^

相关内容