ip addr show 通过 ip 地址查找接口名称

ip addr show 通过 ip 地址查找接口名称

我希望能够输出 IP 地址使用的接口名称。例如,在下面的输出中,我知道 IP 地址192.168.248.130在界面上ens33

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: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    link/ether 00:0c:29:c6:d1:08 brd ff:ff:ff:ff:ff:ff
    altname enp2s1
    inet 192.168.248.130/24 brd 192.168.248.255 scope global dynamic noprefixroute ens33
       valid_lft 1756sec preferred_lft 1756sec
    inet6 fe80::55bb:a133:fb76:69d9/64 scope link noprefixroute 
       valid_lft forever preferred_lft forever

我希望输出是192.168.248.130/24 ens33

答案1

ip 手册页提及单行和简短输出的选项-o-br

$ IP=192.168.120.19
$ ip -br addr show to $IP
wlp113s0         UP             192.168.120.19/24 fe80::a15a:dd9f:8fbf:f1dd/64

这几乎就是你想要的。我会选择awk其余的:

$ ip -br addr show to $IP | awk '{print $3,$1}'
192.168.120.19/24 wlp113s0

答案2

ip另一个答案比较短,因此我将添加它作为一种更通用的方法,只需稍加修改即可编译命令的任意字段(或具有 JSON 输出功能的其他字段)。
所以这是脚本:

#!/bin/bash
#Run with IP address as first parameter
ip -j address | jq -j --arg IP "$1" '.[].addr_info[] | select(.family == "inet" and .local == ($IP)) | (.local,"/",.prefixlen," ",.label)'

第一部分ip -j address以 JSON 格式输出数据,然后由 处理jq。其-j参数从输出中删除引号和换行符。其--arg IP "$1"参数将第一个 shell 参数作为内部变量传递知识产权

中间部分选择所需的addr_info元素,最后一部分(最后一个之后|)编译输出。

注释:

  • 似乎有必要将 shell 变量包装在一个新变量中(此处知识产权) 来jq接受它。
  • 变量周围的括号($IP)是必需的,参见对此答案的评论

相关内容