Linux Shell用IP反查网卡名称

在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

修改记录

  1. 多IP网卡情况下,不能用grep匹配到IP地址行后,进行准确倒推网卡名称所在的行
  2. macvlan形成的子网卡接口名称,含有主网卡的信息,需要去除

你可能感兴趣的:(小工具,linux)