我在一个文件中收集了vmstat数据。它提供了关于空闲、缓冲和缓存的详细信息。
因为我有兴趣找到内存使用情况,所以我应该对vmstat输出的每一行执行以下计算——USED=TOTAL-(FREE+BUFFER+CACHE),其中TOTAL是内存总量,USED是瞬时内存值。
总内存=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

最佳答案

一开始不应该打印$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)。

关于bash - 在bash中处理整数超出范围,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/3593791/

10-12 00:44