在Linux有的应用场合,我们需要用ip反查或查找ip所在的网卡名称。
想着在Linux中应该有比较直接的Shell命令可以做到这点。但网络搜到的第一个例子竟然是用双层循环遍历的方法,至少在形式和逻辑上复杂了!
恰好,最近了解到grep -o pattern,可以仅匹配内容输出,以及grep [-A n] [-B n] [-C n],可以将匹配行的上下、前后显示出来,而不仅仅是匹配行自身输出,由此想出,可以稍微直接、“飞线"地由IP找到网卡名字。
它的Script
ip addr | grep -B 2 192.168.31.125 | head -n 1 | awk -F: '{ print $2 }' | tr -d [:blank:]
它的逻辑
- ip addr获取本机所有ip
- 用grep命令搜索匹配ip的行,且同时显示匹配行的前面两行。注:根据ip addr命令显示格式,在第一行含有网卡名称,-B参数可以根据实际情况进行调整
- 用head命令仅取第一行
- 用awk命令根据格式取出网卡名称
- 用tr命令删除网卡名称中含有的空格
它的延伸
可以由此Shell命令组合模式,演化出由mac找ip或网卡等 :)
版本2.0
在最近的一次实践中,发现原本描述的脚本,并不能很好地适应网卡多IP的场景和macvlan子网卡接口场景,现将新的反查逻辑修订如下:
findIP="172.16.78.9"
# 按照网卡名行,开头为数字编号,进行过滤选择
for devEnum in $(ip link show | grep ^[0-9]\\+: | awk -F ' ' {'print $2'})
do
echo "devEnum: $devEnum"
# 去掉后缀冒号
devName=${devEnum%:}
# 去掉可能的子网卡接口后缀
devName=${devName%@*}
echo "devName: $devName"
if [ $(ip addr show $devName | grep -c $findIP) -gt 0 ]; then
echo "has find $findIP at dev $devName"
break
fi
done
修改记录
- 多IP网卡情况下,不能用grep匹配到IP地址行后,进行准确倒推网卡名称所在的行
- macvlan形成的子网卡接口名称,含有主网卡的信息,需要去除