首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >AWK和电源的问题(DD-WRT)

AWK和电源的问题(DD-WRT)
EN

Stack Overflow用户
提问于 2016-10-29 14:51:20
回答 2查看 204关注 0票数 0

我试图使用以下命令将数字之和提取为文件(wa_cidr)中的变量(cwr):

代码语言:javascript
复制
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}')

但是,输出是空的。

如果我改变角色..。

代码语言:javascript
复制
{n += 2**(32 - $NF)} 

为了..。

代码语言:javascript
复制
{n += (32 - $NF)} 

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

似乎我无法在AWK中使用2**X或2^X来执行(32 - $NF)的功能。

如果我在命令行上这样做,例如.

代码语言:javascript
复制
$ echo $(2**5)

没有问题,结果是32。

我试过许多公式的变体(副式等)。但似乎什么都起不到作用。

怎么啦?能用另一种方式做吗?

谢谢你,瑟伦

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-10-29 17:30:25

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

代码语言:javascript
复制
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)
票数 1
EN

Stack Overflow用户

发布于 2016-10-30 19:52:43

嗯,当我提到在DD-WRT Shell中有些东西是有限的时,我似乎发现了一些东西。

根据这个网站,operator#awk,“传统的awk实现不提供指数运算符,所以我们定义了一个函数来计算指数”。

因此,要使代码正常工作,它需要如下所示:

代码语言:javascript
复制
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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40320303

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档