Обработка целых чисел вне диапазона в bash - PullRequest
2 голосов
/ 29 августа 2010

Я собрал данные vmstat в файл. Он дает подробную информацию о свободном, буфере и кеше. Так как я заинтересован в поиске использования памяти, я должен выполнить следующие вычисления для каждой строки вывода vmstat - USED = TOTAL - (FREE + BUFFER + CACHE), где TOTAL - общая память RAM, а USED - мгновенное значение памяти , ОБЩАЯ память = 4042928 (4 ГБ)

Мой код здесь

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 ]

4 голосов
/ 29 августа 2010

Вы не должны печатать $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 здесь ).

2 голосов
/ 29 августа 2010

вы можете просто сделать это с помощью одной команды awk

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