AWK 的问题和 (DD-WRT) 的能力
Problems with AWK and power of (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
我尝试了公式的许多变体(括号等),但似乎没有任何效果。
怎么了?可以换个方式吗?
谢谢,
索伦
如果您的正则表达式是正确的,那么这将是执行您似乎正在尝试执行的操作的正确语法:
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,"traditional awk implementations do not provide an exponent operator, so we define a function to calculate the exponent"。
因此,要使代码正常工作,它需要看起来像这样:
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。
感谢大家的投入!
/索伦
我正在尝试使用以下命令将数字总和提取到文件 (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
我尝试了公式的许多变体(括号等),但似乎没有任何效果。
怎么了?可以换个方式吗?
谢谢, 索伦
如果您的正则表达式是正确的,那么这将是执行您似乎正在尝试执行的操作的正确语法:
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,"traditional awk implementations do not provide an exponent operator, so we define a function to calculate the exponent"。
因此,要使代码正常工作,它需要看起来像这样:
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。
感谢大家的投入!
/索伦