Awk

在 vmstat 上 awk 以獲取 si,所以

  • November 6, 2011

我正在編寫一個 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 的新手,但我仍在努力尋找出路。你能告訴我我該怎麼做嗎?

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

引用自:https://serverfault.com/questions/328008