我试图使用以下命令将数字之和提取为文件(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。
我试过许多公式的变体(副式等)。但似乎什么都起不到作用。
怎么啦?能用另一种方式做吗?
谢谢你,瑟伦
发布于 2016-10-29 17:30:25
如果您的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)发布于 2016-10-30 19:52:43
嗯,当我提到在DD-WRT Shell中有些东西是有限的时,我似乎发现了一些东西。
根据这个网站,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
https://stackoverflow.com/questions/40320303
复制相似问题