AWK的问题和(DD-WRT)的功能



我正在尝试使用以下命令提取文件(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。

我尝试了很多公式的变化(括号等),但似乎没有工作。

怎么了?可以用另一种方法吗?

谢谢,Søren

如果你的regexp是正确的,那么这将是正确的语法来做你似乎想做的事情:

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)

嗯,当我提到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。

谢谢大家的意见!

/Søren

相关内容

  • 没有找到相关文章

最新更新