【问题标题】:AWK (or similar) - change 2 lines below the matching patternAWK(或类似) - 更改匹配模式下方的 2 行
【发布时间】:2018-10-13 00:36:24
【问题描述】:

我有一个问题,我认为用 awk 最容易解决,但我还是绕了一圈。 在一个文件中,我有这样的重复输出:

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

然后这个块将重复。

a)我想在 BGPIpv4Route.* 上进行匹配,然后跳过 2 行(awk 的“n”关键字),然后在达到前缀长度时: - 要么用随机替换它(25,30) 要么 - 更好,但我猜更难(不知道跟踪使用的内容并在 /25../30 之间循环) -> 第一次出现 /25,第二次出现 /26...直到 /30,然后回滚到/25

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

例如:如果此事件的 PrefixCount 被替换为 /25,则其后一行的 NetworkCount = 65536 / 2 ^ 7 = 65536 / 128 = 512

我发现了一些示例,在匹配的一行之后插入/更改一行(或在匹配项下方使用计数器变量 X 行),但我对值生成部分以及更改两行其中一个有点困惑取决于对方。 不知道我说得有没有道理……我现在到处都发现了一些东西,让我有点不知所措。

提前致谢!

【问题讨论】:

    标签: parsing awk scripting insert


    【解决方案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 上下文限定它们。

    【讨论】:

    • 谢谢!奇迹般有效。我不敢相信它是如此简单。我学到了一些新东西。
    • 现在正在考虑...如果它找到 PrefixLength 条目而没有前面的 BgpIpv4Route 条目,这也会导致更改,不是吗?有没有办法让它成为一个约束,仅当它发现它们是 BgpIpv4Route 匹配后的第 3 和第 4 行时才替换 PrefixLength 和 NetworkCount?
    • 是的,用上下文切换记录行号,除模式匹配外进行比较。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-20
    • 1970-01-01
    • 2023-03-17
    • 2011-08-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多