在bash中处理超出范围的整数
我在一个文件中收集了vmstat数据。它给出了有关空闲、缓冲和缓存的详细信息。 因为我对查找内存使用情况感兴趣,所以应该对vmstat输出的每一行执行以下计算--USED=TOTAL-(FREE+BUFFER+CACHE),其中TOTAL是RAM内存总量,USED是瞬时内存值。 总内存=4042928(4 GB) 我的密码在这里在bash中处理超出范围的整数,bash,awk,biginteger,Bash,Awk,Biginteger,我在一个文件中收集了vmstat数据。它给出了有关空闲、缓冲和缓存的详细信息。 因为我对查找内存使用情况感兴趣,所以应该对vmstat输出的每一行执行以下计算--USED=TOTAL-(FREE+BUFFER+CACHE),其中TOTAL是RAM内存总量,USED是瞬时内存值。 总内存=4042928(4 GB) 我的密码在这里 grep -v procs $1 | grep -v free | awk '{USED=4042928-$4-$5-$6;print $USED}' > tes
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节)。您只需使用一个awk命令即可
vmstat | awk 'NR>2{print 4042928-$4-$5-$6 }' file
awk
错误意味着输入字段太多(你能告诉我们你输入的一行是什么样子的吗?)而不是一个数学错误。我的输入文件在第六个字段之前都是这样的。。。0 2 180728 25172 664 8520