2010-08-29 20 views
2

我已將vmstat數據收集到一個文件中。它提供了有關免費,緩衝和緩存的詳細信息。 即使我有興趣查找內存使用情況,我應該對每行vmstat輸出執行以下計算 - USED = TOTAL - (FREE + BUFFER + CACHE)其中TOTAL是總RAM內存,USED是瞬時內存值。 總內存= 4042928(4 GB)在bash中處理整數超出範圍

我的代碼是在這裏

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 
+1

的'awk'錯誤意味着太多的輸入域做到這一點(可你怎麼我們什麼1線你輸入的樣子?),而不是一個數學錯誤。 – 2010-08-29 06:37:53

+0

我的輸入文件看起來像這樣直到第6場...... 0 2 180728 25172 664 8520 – 2010-08-29 06:51:11

回答

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場的限制。

因爲你的領域456分別爲251726648520(從您的意見之一),你USED值變爲4042928-25172-664-85204008572

如果你試圖打印USED,這就是你會得到什麼,不過是因爲你想打印$USED,它認爲你想$4008572(場數4008572),這僅僅是一個小超過32000範圍。

有趣的是,如果你有更多的可用內存,你不會得到錯誤,但你還是會得到:-)

一個錯誤值順便說一句,gawk沒有這個限制,它只是打印一個空白字段(例如,請參閱第11.9節here)。

2

你可以只用一個awk命令

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