Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在bash中处理超出范围的整数_Bash_Awk_Biginteger - Fatal编程技术网

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

在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

我在一个文件中收集了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}' > 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