首页 > 解决方案 > 文件中的 Bash Hex 到 Dec IP 转换

问题描述

我有一个文件,其中有数百行看起来与此类似:

index.=10200,intf.10200.4=eth1,vlan.10200.4=500,IP-Addr.10200.4=C0A80A78,uptime.10200.4=120days,duplex.10200.4=full,status.10200.4=up
index.=10201,intf.10201.25=eth1,vlan.10201.25=500,IP-Addr.10201.25=C0A80A79,uptime.10201.25=80days,duplex.10201.25=full,status.10201.25=up
index.=10202,intf.10202.6=eth1,vlan.10202.6=500,IP-Addr.10202.6=C0A80A80,uptime.10202.6=240days,duplex.10202.6=full,status.10202.6=up

我正在尝试通过就地编辑文件将所有十六进制 IP 地址转换为点分十进制。我已经在网上看到了所有 bash hex to dec ip 转换器,但这些都是用于输入一个值然后转换的。

我将如何去编辑文件中的值?

更详细的数据集:

index.=10200,CDP-Local-Intf.10200=FastEthernet0/0/1,CDP-IP-Addr.10200.44=C0A80A78,CDP-Uptime.10200.44=Timeticks:(342342322)52days,CDP-Opposite-Intf.10200.44=FastEthernet0/1/0,CDP-VLAN.10200.44=100,CDP-Duplex.10200.44=3,CDP-Other.10200.44=00000032
index.=10201,CDP-Local-Intf.10201=FastEthernet2/0/1,CDP-IP-Addr.10201.25=C0A80A79,CDP-Uptime.10201.25=Timeticks:(342342322)52days,CDP-Opposite-Intf.10201.25=FastEthernet0/2/0,CDP-VLAN.10201.25=101,CDP-Duplex.10201.25=3,CDP-Other.10201.25=00000032
index.=10202,CDP-Local-Intf.10202=FastEthernet2/1/1,CDP-IP-Addr.10202.11=C0A80A80,CDP-Uptime.10202.11=Timeticks:(342342322)52days,CDP-Opposite-Intf.10202.11=FastEthernet0/3/0,CDP-VLAN.10202.11=101,CDP-Duplex.10202.11=3,CDP-Other.10202.11=00000032

标签: bashhexip-address

解决方案


如果perl是您的选择,您会尝试以下方法:

perl -i -pe 's/(CDP-IP-Addr[\d.]+=)([[:xdigit:]]{8})/$1 . join(".", unpack("C4", pack("H8", $2)))/e' datafile
  • 启用就地编辑的-i选项。perl
  • 该选项告诉 perl 像或那样-pe逐行处理输入文件 。sedawk
  • 正则表达式(CDP-IP-Addr[\d.]+=)([[:xdigit:]]{8})提取子字符串“CDP-IP-Addr.xx.xx=”和以下十六进制字符串。它们被按$1顺序捕获$2
  • 该函数unpack("C4", pack("H8", $2))将 8 位十六进制字符串$2转换为包含四个十进制值的数组。
  • e切换到运算符告诉 perl将s/regex/replacement/替换作为 perl 表达式进行计算。

推荐阅读