我正在尝试使用此命令将数字总和提取到文件(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。
我已尝试过很多关于公式(parantheses等)的变化,但似乎没有任何工作。
有什么问题?可以用另一种方式完成吗?
谢谢, 索伦
答案 0 :(得分: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)
答案 1 :(得分:1)
根据这个网站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值。
谢谢大家的投入!
/索伦