shell - 从 Linux 计算机中提取接口(interface)的网络范围和子网

标签 shell awk sed scripting grep

$ ip a 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever 2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1460 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 42:01:0a:80:00:06 brd ff:ff:ff:ff:ff:ff
    inet 10.128.0.6/32 brd 10.128.0.6 scope global noprefixroute dynamic eth0
       valid_lft 2327sec preferred_lft 2327sec
    inet6 fe80::4001:aff:fe80:6/64 scope link noprefixroute
       valid_lft forever preferred_lft forever

我已经尝试了下面的命令,但我想用“0”替换最后一个八位字节

ip a | grep ": eth0" -A 2 |  grep inet | awk '{print $2}'
10.128.0.6/32

预期输出

10.128.0.0/32

注意:- IP 地址最后一个八位字节超过一位数字,例如,最后一个八位字节最少为一位数字,最多为三位

10.128.0.6
10.128.0.16
10.128.0.116

所以基本上我们需要用“\”之间的字符串替换“0”

最佳答案

您能否尝试以下操作(因为OP提到的ip a命令没有示例,因此无法测试)。

编辑:根据OP的要求添加一种线性形式的解决方案,该解决方案也将值保存到变量中:

value=$(ip a | awk '/: eth0/{found=1} found && /inet/ && !count{match($2,/[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+\/[0-9]+/);val=substr($2,RSTART,RLENGTH);sub(/[0-9]+\//,"0/",$2);print substr($2,RSTART,RLENGTH);count=1}')

输出如下。

10.128.0.0/32

关于shell - 从 Linux 计算机中提取接口(interface)的网络范围和子网,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59649346/

相关文章:

linux - 想知道脚本结果的 pid

linux - 带有制表符和否定匹配的 Sed

linux - sed 行删除是原子的吗?

linux - 如何让我的 Golang Web 服务器在后台运行?

linux - 为什么我在为我的 cron 作业寻找匹配的 `' 时收到意外的 EOF?

android - 如何使用 ADB 命令检测正在运行的应用程序

unix - 使用 awk 在列中填充前导零

linux - 使用 bash 检查列中值的统计信息

shell - 我写的 shell 脚本有什么问题

regex - 如何使用动态列对日志输出进行 grep