0

我正在尝试使用以下命令将数字总和提取到文件(wa_cidr)中的变量(cwr):

cwr=$(grep -E "^([0-9]{1,3}\.){3}[0-9]{1,3}(\/([0-9]|[1-2][0-9]|3[0-2]))?$" /tmp/wa_cidr | awk -F '/' '`{n += 2**(32 - $NF)}` END {print n}')

但是,输出为空。

如果我改变部分...

{n += 2**(32 - $NF)} 

至...

{n += (32 - $NF)} 

我得到了写入 cwr 变量的有效结果。

看来我无法在 AWK 中使用 2**X 或 2^X 来实现 (32 - $NF) 的功能。

如果我在命令行上执行此操作,例如使用...

$ echo $(2**5)

没有问题,结果是 32。

我已经尝试了公式的许多变体(括号等),但似乎没有任何效果。

怎么了?可以用另一种方式完成吗?

谢谢,索伦

4

2 回答 2

1

嗯,当我提到 DD-WRT Shell 中的某些内容受到限制时,似乎我正在做某事。

根据该网站https://rosettacode.org/wiki/Exponentiation_operator#awk,“传统的 awk 实现不提供指数运算符,因此我们定义了一个函数来计算指数”。

因此,要使代码正常工作,它需要看起来像这样:

cwr=$(grep -E "^([0-9]{1,3}\.){3}[0-9]{1,3}(\/([0-9]|[1-2][0-9]|3[0-2]))?$" /tmp/wa_cidr | awk -F '/' 'function pow(x,n){r=1;for(i=0;i<n;i++)r=r*x;return r}{c += pow(2,(32-$NF))} END {print c}')

这给出了 3996 的正确值。

谢谢大家的投入!

/索伦

于 2016-10-30T19:52:43.417 回答
1

如果您的正则表达式是正确的,那么这将是执行您似乎正在尝试执行的操作的正确语法:

cwr=$(awk -F'/' '/^([0-9]{1,3}\.){3}[0-9]{1,3}(\/([0-9]|[1-2][0-9]|3[0-2]))?$/{n += 2^(32 - $NF)} END {print n+0}' /tmp/wa_cidr)
于 2016-10-29T17:30:25.903 回答