Este script AWK lê a segunda linha e usa os cabeçalhos de campo como índices nos dados de cada linha para que você possa se referir a eles pelo nome. Aqui está o one-liner. Eu quebro linha por linha abaixo.
vmstat -n 1 | awk 'NR == 1 {next} NR == 2 {for (i = 1; i <= NF; i++) fields[$i] = i; next} {split($0, data); item = data[fields["si"]]; print item; totals[fields["si"]] += item} NR >= 6 + 2 {exit} END {print "Average", totals[fields["si"]]/(NR - 2)}'
Como mostrado, ele imprime o conteúdo da coluna "si" e a média no final. Você pode manipular vários campos ou fazer uma iteração em todos os campos.
Você pode expandir isso para manipular outros campos, fazer comparações de uma linha com a anterior ou fazer totais ou outros cálculos. Você pode parar, como mostrei, depois de um certo número de registros.
A opção -n
para vmstat
faz com que o cabeçalho seja impresso apenas uma vez.
A divisão:
vmstat -n 1 | awk 'NR == 1 {next} # skip the first line
# for the second line, create an array of field positions indexed by the
# name of the field then do "next" so this line is not processed further
NR == 2 {for (i = 1; i <= NF; i++) fields[$i] = i; next}
{split($0, data); # split the line of values into an array
item = data[fields["si"]]; # pick out an item based on its name
print item;
totals[fields["si"]] += item} # accumulate a total
# exit when the number of desired records (plus the two header lines)
# has been read, you could use a vmstat argument to do this instead
NR >= 10 + 2 {exit}
# calculate and print the average (subtract the two header lines from the record count)
END {print "Average", totals[fields["si"]]/(NR - 2)}'