2010-08-29 3 views
2

J'ai collecté les données vmstat dans un fichier. Il donne des détails sur free, buffer et cache. SInce je suis intéressé à trouver l'utilisation de la mémoire, je devrais faire le calcul suivant pour chaque ligne de sortie vmstat - USED = TOTAL - (FREE + BUFFER + CACHE) où TOTAL est la mémoire RAM totale et USED est la mémoire instantanée valeur. TOTAL mémoire = 4042928 (4 Go)Gestion des entiers hors plage dans bash

Mon code est ici

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

La 'erreur awk' implique trop de champs d'entrée (pouvez-vous comment nous ce que 1 ligne de votre entrée ressemble?) Plutôt que d'une erreur de calcul. –

+0

Mon fichier d'entrée ressemble à ceci jusqu'au sixième champ ... 0 2 180728 25172 664 8520 –

Répondre

4

Vous ne devriez pas imprimer $USED pour commencer, la variable awk est 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 

Qu'est-ce le plus susceptible de se produire dans votre cas est que vous utilisez un awk avec cette limitation d'environ 32000 champs par enregistrement.

Parce que vos champs 4, 5 et 6 sont respectivement 25172, 664 et 8520 (d'un de vos commentaires), votre valeur USED devient 4042928-25172-664-8520 ou 4008572.

Si vous avez essayé d'imprimer USED, c'est ce que vous obtenez, mais parce que vous essayez d'imprimer $USED, il pense que vous voulez $4008572 (numéro de champ 4.008.572) qui est juste un peu peu au-delà de la gamme 32000 .

Fait intéressant, si vous avez beaucoup plus libre mémoire, vous ne seriez pas obtenir l'erreur, mais vous souhaitez toujours obtenir une valeur erronée :-)

Par ailleurs, gawk n'a pas cette limitation, il imprime simplement un champ vide (voir, par exemple, la section 11.9 here).

2

vous pouvez simplement le faire avec une seule commande awk

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