我希望能够输出 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)
是必需的,参见对此答案的评论)