在 vmstat 上使用 awk 获取 si,so

在 vmstat 上使用 awk 获取 si,so

我正在编写一个 shell 脚本来检查不同时间间隔的vmstat si数据so

vmstat 1示例输出:

procs -----------memory---------- ---swap-- -----io---- -system-- ----cpu----
r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa
0  0  45820 899252  86700 468520    0    0     0    60  127 5821 20  7 34  0
0  0  45820 899252  86704 468504    0    0     0    32   44  104  0  0 100  0

我想使用 awk、sed 提取siso放入不同的变量中以供进一步使用。我是 awk、sed 的新手,仍在努力寻找解决方法。你能告诉我怎么做吗?

答案1

此 AWK 脚本读取第二行并使用字段标题作为每行数据的索引,以便您可以按名称引用它们。这是一行代码。我在下面逐行说明。

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)}'

如图所示,它打印“si”列的内容和最后的平均值。您可以处理多个字段或遍历所有字段。

您可以扩展它来处理其他字段,将一行与前一行进行比较,或者进行总计或其他计算。如我所示,您可以在一定数量的记录之后停止。

-n选项vmstat使得标题仅打印一次。

细分:

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)}'

答案2

SWAPIN=$(vmstat | egrep -v 'swap|si' | awk '{ print $7 }')
SWAPOUT=$(vmstat | egrep -v 'swap|si' | awk '{ print $8 }')

或更“标准”的方式:

$ vmstat | awk '{ for (i=1; i<=NF; i++) if ($i=="si") { getline; print $i }}'
  • 内置NF变量为您提供当前行中的字段数
  • getline读取下一个输入行

答案3

如果我不提供 perl 单行等效代码,我会感到疏忽:

SWAPIN=$(vmstat | perl -lane 'next if /^(procs|r)/; print $F[7]')
SWAPOUT=$(vmstat | perl -lane 'next if /^(procs|r)/; print $F[8]')

相关内容