Awk
在 vmstat 上 awk 以獲取 si,所以
我正在編寫一個 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 來提取
si
並so
放入不同的變數以供進一步使用。我是 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)}'