我在一个文件中收集了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
最佳答案
一开始不应该打印$USED
,awk
中的变量是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个字段的限制。因为您的字段
4
、5
和6
分别是25172
、664
和8520
(来自您的一个注释),所以您的USED
值变为4042928-25172-664-8520
或4008572
。如果您试图打印
USED
,这就是您将得到的结果,但是,因为您正在尝试打印$USED
,它认为您需要$4008572
(字段号4008572),这只是稍微超出32000范围。有趣的是,如果你有更多的空闲内存,你不会得到错误,但你仍然会得到一个错误的值:-)
顺便说一下,
gawk
没有这个限制,它只是打印一个空字段(例如,请参见第11.9节here)。关于bash - 在bash中处理整数超出范围,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/3593791/