首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >一个IP范围的grep?

一个IP范围的grep?
EN

Unix & Linux用户
提问于 2018-08-11 00:37:22
回答 2查看 4.4K关注 0票数 2

在本地IP地址为10.0.0.159的RHEL 7框上,以下命令输出IP 10.0.0.159

代码语言:javascript
复制
$ 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”,命令必须更改为什么?

EN

回答 2

Unix & Linux用户

回答已采纳

发布于 2018-08-11 01:08:15

注意: ifconfig是一个不推荐的cmd。您应该使用cmds。在未来的iproute2包中。下面,我将展示如何使用ip来使用替换工具来完成您想要的任务。

与其使用ifconfig执行此操作,不如使用ip命令。

IP CIDR

此表单以CIDR符号显示IP地址:

代码语言:javascript
复制
$ 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

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

代码语言:javascript
复制
$ ip route show | awk '/eth0.*scope/ {print $1}'
10.0.2.0/24

ipcalc

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

代码语言:javascript
复制
$ 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来解析通常过于复杂的文本。

票数 3
EN

Unix & Linux用户

发布于 2018-08-11 01:53:12

若要更改命令行以执行您想做的事情,首先需要了解它正在做什么。下面是一个分析:

代码语言:javascript
复制
echo "$()""(rw,sync)" 

将运行something并将其作为echo的输入。其他所有内容都是echo编辑的普通文本。

代码语言:javascript
复制
ifconfig eth0

获取网络信息。

代码语言:javascript
复制
grep -Eo 'inet (addr:)?([0-9]*\.){3}[0-9]*' 

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

代码语言:javascript
复制
grep -Eo  '([0-9]*\.){3}[0-9]*' 

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

代码语言:javascript
复制
grep -v '127.0.0.1'

是从输出列表中删除那个IP,因为您不关心回送IP。

正如您所看到的,您的命令是获取ifconfig的输出并过滤出信息,只隔离您想要的信息。它没有做任何计算或信息处理。但是您希望它打印的是子网和掩码,它们是ifconfig没有显式显示的信息。换句话说,你不能为了得到你想要的东西而对事物进行不同的过滤。您必须进行一些处理,使用行尾的Mask字段进行一些计算。总之,您不能“更改命令以打印您想要的内容”。您必须创建一个完全不同的命令。

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

代码语言:javascript
复制
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的输出拆分为address (10.0.0.159)和掩码(8)。然后将IP分解成4个数字。然后根据掩码将数字设置为零。但这并不是按位计算,这意味着它只处理8,16和24面具,因为这是我硬编码的。;)

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

票数 3
EN
页面原文内容由Unix & Linux提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://unix.stackexchange.com/questions/461927

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档