来自iptables列表输出的总和字节

时间:2015-11-19 03:15:10

标签: linux

允许打印num-bytes。

我最好的尝试是

{{1}}

这将为我提供大量规则列表,包括第二列中的字节数。不幸的是,获得第二列非常困难。

一种选择是将其传输到文件中,并在文件上使用cut,但目标是尽可能少地进行操作。任何帮助,将不胜感激。

2 个答案:

答案 0 :(得分:1)

此bash命令将第二列相加:

c=0; while read a nbyte rest; do ((c+=nbyte)); done < <(sudo iptables -L -n -v -x | grep -i accept); echo $c

或者,写在多行:

c=0
while read a nbyte rest
do
    ((c+=nbyte))
done < <(sudo iptables -L -n -v -x | grep -i accept)
echo $c

如何运作

  • c=0

    这会将计数初始化为零。

  • while read a nbyte rest; do

    这会读取一行输入,并将第一列分配到a,将第二列分配到nbyte,将所有剩余列分配到rest

  • ((c+=nbyte))

    这会将nbyte中的值添加到c。如果nbyte包含字符串而不是数字,则bash会将字符串视为零,并将其视为零。

  • done < <(sudo iptables -L -n -v -x | grep -i accept)

    这样就完成了while循环,并通过进程替换为其提供输入。

  • echo $c

    显示结果。

答案 1 :(得分:0)

如果您通过grep管道已经很好了,那么我们可以免费将grep替换为awk,并在awk内处理所有数学运算

如果你要包含iptables命令输出的样本,那就太方便了。虽然没有它,但我希望你可以使用它:

sudo iptables -L -n -v -x | awk 'tolower($0)~/accept/{n+=$2} END{printf("%d\n",n)}'

第一个条件在行中查找不区分大小写的“accept”,如果找到它,则将第二个以空格分隔的字段添加到变量中。

第二个条件在输入完成时运行,只需打印变量。