使用bash,如何在一行中获取网络设备名称和ip地址



我想获得网络接口设备名称(ens###(及其关联的IP地址(###.###.###(。我有获得其中一个的解决方案,但我找不到可以将每对(名称+IP(输出到一行的东西。

以下是获取IP 的命令

ip address | grep -Eo 'inet (addr:)?([0-9]*.){3}[0-9]*' | grep -Eo '([0-9]*.){3}[0-9]*' | grep -v '127.0.0.1'

在这里我可以得到设备名称

ip address | grep -v lo | cut -d ' ' -f2 | tr ':' 'n' | awk NF

然而,我想要一种方法来获得这两种方法,它们将把每组输出到自己的行,类似于

ens32 10.0.0.100
ens33 10.1.0.100

编辑:

以下是ip地址的输出示例

[root@centos ~]# ip address
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1
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: ens32: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 00:00:00:00:00:00 brd ff:ff:ff:ff:ff:ff
inet 10.0.0.100/23 brd 10.0.1.255 scope global dynamic ens32
valid_lft 83040sec preferred_lft 83040sec
inet6 0000::000:0000:0000:0000/64 scope link
valid_lft forever preferred_lft forever
3: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 00:00:00:00:00:00 brd ff:ff:ff:ff:ff:ff
inet 10.1.0.100/24 brd 10.0.2.255 scope global dynamic ens33
valid_lft 1277sec preferred_lft 1277sec
inet6 0000::000:0000:0000:0000/64 scope link
valid_lft forever preferred_lft forever

解决方案:

这两个都会给我相同的期望输出。谢谢你的帮助!

ip -o addr show scope global | awk '/^[0-9]:/{print $2, $4}' | cut -f1 -d '/'
ip -o addr show scope global | tr -s ' ' | tr '/' ' ' | cut -f 2,4 -d ' '

如果你需要一个单行,试试这个(感谢Dougie提供了更精细的ip命令(:

ip -oneline -4 addr show scope global | tr -s ' ' | tr '/' ' ' | cut -f 2,4 -d ' '

-oneline将每个接口的输出强制为一行。

然后,我们从输出中cut只输出接口名称和IP,tr一路上对其进行了一点转换(用于剪切以消除多余的东西(。

awk一如既往地发挥着魅力。

ip address | 
awk '
/^[0-9]:/{
name=substr($2, 1, length($2) - 1)
}
/^[ ]*inet /{
split($2, a, "/")
if (name != "lo")
print name,a[1]
}
'

将输出:

ens32 10.0.0.100
ens33 10.1.0.100
  1. 如果行以数字和doublescore开头,则从第二个字段中获取名称,但删除带substr的:除外
  2. 如果该行以inet和空格开头,则意味着第二个arg具有ip地址。我还通过简单的拆分删除了网络掩码后缀
  3. 如果接口名称为lo,则不打印输出,从而过滤环回接口

最新更新