![grep 查找 IP 范围?](https://linux22.com/image/138487/grep%20%E6%9F%A5%E6%89%BE%20IP%20%E8%8C%83%E5%9B%B4%EF%BC%9F.png)
在本地 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]*
-o
inet addr:10.0.0.159 Bcast:10.0.0.255 Mask:255.255.255.0
inet addr:10.0.0.159
Bcast
Mask
grep -Eo '([0-9]*\.){3}[0-9]*'
这与上面完全相同,只是没有 label inet addr
,这意味着您要专门隔离 IP 并删除标签。最后,
grep -v '127.0.0.1'
正在从输出列表中删除该 IP,因为您不关心环回 IP。
正如您所看到的,您的命令正在获取输出ifconfig
并过滤信息,仅隔离您想要的信息。它不进行任何计算或信息处理。但你希望它打印的是子网和掩码,这些是 .net 没有显式显示的信息ifconfig
。换句话说,你不能只是以不同的方式过滤掉一些东西来得到你想要的东西。您将必须使用Mask
行末尾的字段进行一些处理和一些计算。总之,你不能“改变命令来打印出你想要的东西”。您必须创建一个完全不同的命令。
slm 的答案使用类似的技术(过滤掉信息以仅保留您想要的信息),但将输入更改为包含您需要的信息的命令。 :-) 如果您没有一个可以准确输出您想要的内容的命令,并且对其进行一些处理是您唯一的选择,那么这里有一组丑陋的if
s ,您可以将其用作将来的示例或基础。它使用 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];}'
此命令将输出拆分为ip
ress add
(10.0.0.159) 和 mask (8)。然后它将 IP 分成 4 个数字。然后它根据掩码将数字设置为零。但它不是按位的,这意味着它只会处理掩码 8、16 和 24,因为那是我硬编码的。 ;)
我希望您能更多地了解您手头的工具。 ^_^