我在文件中收集了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
答案 0 :(得分:4)
您不应该首先打印$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)。
答案 1 :(得分:2)
你可以用一个awk命令
来做vmstat | awk 'NR>2{print 4042928-$4-$5-$6 }' file