代码之家  ›  专栏  ›  技术社区  ›  Sharat Chandra

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

  •  2
  • Sharat Chandra  · 技术社区  · 14 年前

    总内存=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
    
    2 回复  |  直到 14 年前
        1
  •  4
  •   paxdiablo    14 年前

    你不应该打印 $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
    

    在你的案例中最有可能发生的是你正在使用

    因为你的领域 4 5 6 25172 , 664 8520 (来自你的一个评论),你的 价值变成 4042928-25172-664-8520 4008572 .

    如果你想打印 $已使用 $4008572 小的 位超出32000范围。

    有趣的是,如果你有更多的空闲内存,你不会得到错误,但你仍然会得到一个错误的值:-)

    顺便说一句, gawk 没有这个限制,它只是打印一个空字段(例如,请参见第11.9节) here ).

        2
  •  2
  •   ghostdog74    14 年前

    vmstat | awk 'NR>2{print 4042928-$4-$5-$6 }' file