我有两个文件,第一个file1
是 1000 行,其中包含路由器配置。有一部分是这样的——
!
ipv6 prefix-list CCAV6 seq 5 permit 2217:AB23::/40
route-map DENY-ALL deny 11
!
ip pim sparse-mode
ipv6 address 2617:FB23:0:1::1/128
ipv6 ospf 1 area 0.0.0.0
等等。我的第二个文件file2
是 ipv6 到 ipv4 地址的映射。看起来像这样——
2617:FB23:0:1::1/128 245.82.242.31/32
2217:AB23::/40 64.211.7.157/31
我希望能够替换遍历file1
,如果我的第一列与file2
的任何部分匹配file1
,它应该将其替换为第二列file2
例如,我期望在处理后看到的输出是-
!
ipv6 prefix-list CCAV6 seq 5 permit 64.211.7.157/31
route-map DENY-ALL deny 11
!
ip pim sparse-mode
ipv6 address 245.82.242.31/32
ipv6 ospf 1 area 0.0.0.0
我尝试过使用awk
,但我遇到的所有选项似乎都需要事先了解复制的位置,并且第一列的位置在整个过程中并不保持不变file1
。我会很感激一些想法。
答案1
如果您不太担心多空格/制表符字段分隔符被file1
替换为单个空格:
awk 'NR == FNR{a[$1]=$2; next};
{for (i=1; i<=NF; ++i) printf "%s%s", $i in a?a[$i]: $i, i == NF?"\n": " "}' file2 file1
产量
!
ipv6 prefix-list CCAV6 seq 5 permit 64.211.7.157/31
route-map DENY-ALL deny 11
!
ip pim sparse-mode
ipv6 address 245.82.242.31/32
ipv6 ospf 1 area 0.0.0.0
答案2
以下脚本会将前两个单词中的每一个读入哈希值,然后用 IPV6 替换 IPV4,并停止检查其他模式,如果您认为同一行中可能存在两个地址,请if (j>0) break
从代码中删除 , 。
混合地址代码
#!/usr/bin/nawk -f
BEGIN{while (getline<"map"){w[$1]=$2}}
{for (a in w){
j=gsub(a,w[a])
if (j>0) break
}
print
}
地图文件
2617:FB23:0:1::1/128 245.82.242.31/32
2217:AB23::/40 64.211.7.157/31
主机文件
!
ipv6 prefix-list CCAV6 seq 5 permit 2217:AB23::/40
route-map DENY-ALL deny 11
!
ip pim sparse-mode
ipv6 address 2617:FB23:0:1::1/128
ipv6 ospf 1 area 0.0.0.0
执行
mixaddr hosts
!
ipv6 prefix-list CCAV6 seq 5 permit 64.211.7.157/31
route-map DENY-ALL deny 11
!
ip pim sparse-mode
ipv6 address 245.82.242.31/32
ipv6 ospf 1 area 0.0.0.0
华泰
答案3
#!/bin/bash
IFS=$'\n'
line=`cat ./file2`
for var in $line
do
string1=`echo $var |awk '{print $1}'`
string2=`echo $var |awk '{print $2}'`
sed -i "s#${string1}#${string2}#g" ./file1
done
file1
在运行之前您需要备份。