在bash中处理超出范围的整数

时间:2010-08-29 06:34:45

标签: bash awk biginteger

我在文件中收集了vmstat数据。它提供了有关free,buffer和cache的详细信息。 我有兴趣找到内存使用情况,我应该为每行vmstat输出做以下计算 - USED = TOTAL - (FREE + BUFFER + CACHE)其中TOTAL是总RAM内存,USED是瞬时内存值。 TOTAL memory = 4042928(4 GB)

我的代码在这里

grep -v procs $1 | grep -v free | awk '{USED=4042928-$4-$5-$6;print $USED}' > test.dat
awk: program limit exceeded: maximum number of fields size=32767
        FILENAME="-" FNR=1 NR=1

2 个答案:

答案 0 :(得分:4)

您不应该首先打印$USEDawk中的变量是USED

pax> vmstat
procs -----------memory---------- ---swap-- -----io---- -system-- ----cpu----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa
 0  0      0 1402804 258392 2159316    0    0    54    79  197  479  1  2 93  3

pax> vmstat | egrep -v 'procs|free' | awk '{USED=4042928-$4-$5-$6;print USED}'
222780

在您的情况下最有可能发生的是您使用的awk限制为每条记录约32000个字段。

因为您的字段456分别是251726648520(来自您的一条评论),您的USED值变为4042928-25172-664-85204008572

如果你试图打印USED,那就是你得到的,但是因为你正在尝试打印$USED,它认为你想要$4008572(字段编号4008572)只是位超出32000范围。

有趣的是,如果你有更多的可用内存,你就不会得到错误,但你仍然会得到一个错误的值: - )

顺便说一下,gawk没有这个限制,它只是打印一个空字段(例如,见第11.9节here)。

答案 1 :(得分:2)

你可以用一个awk命令

来做
vmstat | awk 'NR>2{print 4042928-$4-$5-$6 }' file