AWK(或类似) - 在匹配模式下方更改2行

时间:2018-05-02 19:49:31

标签: parsing awk scripting insert

我有一个问题,我认为使用awk解决这个问题最容易,但我把头包裹起来。 在文件中我有重复这样的输出:

....
  Name="BgpIpv4RouteConfig_XXX">
          <Ipv4NetworkBlock id="13726"
           StartIpList="x.y.z.t"
           PrefixLength="30"
           NetworkCount="10000"
... other output

然后这个区块会重复。

a)我想在BGPIpv4Route。*上匹配,然后跳过2行(awk的&#34; n&#34;关键字),然后到达前缀长度: - 要么随机更换(25,30) 要么 - 更好但我觉得更难(想到跟踪在/25../30之间使用和循环)的想法 - &gt;第一次出现/ 25,第二次出现/26...till / 30,然后回滚到/ 25

b)然后根据PrefixCount的新值将NetworkCount下一行计算为65536/2 ^(32-Prefix Count)

例如:如果此次出现的PrefixCount被替换为/ 25,那么它后面的行上的NetworkCount = 65536/2 ^ 7 = 65536/128 = 512

我发现了一些插入/改变一条线后的一个例子(或者匹配下面的一个计数器变量X线),但我对价值生成部分和两条线的改变有点混淆了取决于另一个。 不确定我是否有任何意义......我的头脑现在有点不知所措。

提前致谢!

1 个答案:

答案 0 :(得分:1)

这应该做

$ awk 'BEGIN {q="\""; FS=OFS="="; n=split("25=26=27=28=29=30",ps)}
       /BgpIpv4Route/ {c=c%n+1}
       /PrefixLength/ {$2=q ps[c] q}
       /NetworkCount/ {$2=q 65536/2^(32-ps[c]) q}1' file

可能会通过更改为2^(ps[c]-16)

来最小化计算

如果有自由站立的PrefixLength和NetworkCount属性,您可能需要为每个BgpIpv4Route上下文限定它们。