AWK (или аналогичный) - изменить 2 строки под соответствующим шаблоном - PullRequest
0 голосов
/ 02 мая 2018

У меня есть проблема, которую, я думаю, легче всего решить с помощью awk, но я обнял ее. Внутри файла у меня есть повторяющийся вывод, как это:

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

, тогда этот блок будет повторяться.

a) Я хочу сопоставить на BGPIpv4Route. *, Затем пропустить 2 строки (ключевое слово "n" в awk), а затем при достижении длины префикса: - либо заменить его случайным (25,30) или же - лучше, но я предполагаю, что сложнее (не пришла в голову мысль отслеживать то, что было использовано и проходить между /25../30) -> первое вхождение / 25, второе / 26...till / 30, затем откат к / 25

b) затем в следующей строке с NetworkCount в зависимости от нового значения PrefixCount вычислите его как 65536/2 ^ (32-Prefix Count)

Например: если PrefixCount в этом случае был заменен на / 25, то NetworkCount в следующей за ним строке = 65536/2 ^ 7 = 65536/128 = 512

Я нашел несколько примеров со вставкой / изменением строки после совпадающей (или с переменной счетчика X строк под соответствием), но я немного запутался с частью генерации значения, а также с изменением двух строк, где одна в зависимости от другого. Не уверен, что я что-то понял ... моя голова немного ошеломлена тем, что я сейчас нахожу повсюду.

Заранее спасибо!

1 Ответ

0 голосов
/ 02 мая 2018

это должно сделать

$ 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.

...