如何使用 awk 處理帶有標誌的 iostat 輸出

如何使用 awk 處理帶有標誌的 iostat 輸出

這是我的變數:

HEADER='Device     bps     tps     bread     bwrtn'
HEADERIZE="BEGIN {print \"$HEADER\"}"
PRINTF='{printf "%-10s  %11s  %11s  %12s  %12s  %13s  %13s  %13s\n", device, bps, tps, bread, bwrtn}'
CMD='iostat -DlR 1 2'
FILTER='/^cd/ {next} /^Disks:/ {reportOrd++; next} (reportOrd<2) {next}'
FORMAT='{device=$1; bps="?"; tps="?"; bread=$5; bwrtn=$6}'

$CMD | awk "$HEADERIZE $FILTER $FORMAT $PRINTF"  header="$HEADER"

我希望輸出看起來像這樣:

Device     bps     tps     bread     bwrtn
hdisk0     0.0     0.0     0.0       0.0         
hdisk1     0.0     0.0     0.0       0.0
hdisk2     0.0     0.0     0.0       0.0
hdisk3     0.0     0.0     0.0       0.0

當然,我想要更多的性能標題,但我試圖保持簡單。

當我運行: 時,問題就出現了$CMD | awk "$HEADERIZE $FILTER $FORMAT $PRINTF" header="$HEADER"。它的結果是這樣的:

Device          bps tps bread bwrtn
---------------            ?            ?  --------------------------------------              
%tm                   ?            ?         bwrtn           rps
act                   ?            ?          outs          serv
hdisk1                ?            ?           0.0           0.0
hdisk0                ?            ?           0.0           0.0

我相信變數“FILTER”不正確,但不知道正確的語法。

這是輸入:iostat -DlR 1 2

輸出:

root@myserver #iostat -DlR 1 2

System configuration: lcpu=20 drives=2 paths=16 vdisks=0

Disks:                      xfers                                read                                write                                  queue                  
--------------- -------------------------------- ------------------------------------ ------------------------------------ -------------------------------------- 
                  %tm    bps   tps  bread  bwrtn   rps    avg    min    max time fail   wps    avg    min    max time fail    avg    min    max   avg   avg  serv
                  act                                    serv   serv   serv outs              serv   serv   serv outs        time   time   time  wqsz  sqsz qfull
hdisk1            0.0   0.0    0.0   0.0    0.0    0.0   0.0    0.0    0.0     0    0   0.0   0.0    0.0    0.0     0    0   0.0    0.0    0.0    0.0   0.0   0.0
hdisk0            0.0   0.0    0.0   0.0    0.0    0.0   0.0    0.0    0.0     0    0   0.0   0.0    0.0    0.0     0    0   0.0    0.0    0.0    0.0   0.0   0.0

Disks:                      xfers                                read                                write                                  queue                  
--------------- -------------------------------- ------------------------------------ ------------------------------------ -------------------------------------- 
                  %tm    bps   tps  bread  bwrtn   rps    avg    min    max time fail   wps    avg    min    max time fail    avg    min    max   avg   avg  serv
                  act                                    serv   serv   serv outs              serv   serv   serv outs        time   time   time  wqsz  sqsz qfull
hdisk1            0.0   0.0    0.0   0.0    0.0    0.0   0.0    0.0    0.0     0    0   0.0   0.0    0.0    0.0     0    0   0.0    0.0    0.0    0.0   0.0   0.0
hdisk0            0.0  77.8K  19.0   0.0   77.8K   0.0   0.0    0.0    0.0     0    0  19.0   0.3    0.2    0.5     0    0   0.0    0.0    0.0    0.0   0.0   0.0





Desired output:


Device     bps     tps     bread     bwrtn
hdisk0     0.0     0.0     0.0       0.0         
hdisk1     0.0     0.0     0.0       0.0
hdisk2     0.0     0.0     0.0       0.0
hdisk3     0.0     0.0     0.0       0.0

答案1

解決方案:

iostat -d 1 2 | awk 'BEGIN{print "Device\tbps\ttps\tbread\tbwrtn"}/^hdisk/{print $1"\t"$3"\t"$4"\t"$5"\t"$6}'

輸出:

Device  bps     tps     bread   bwrtn
hdisk1  0.0     0.0     0.0     0.0
hdisk0  0.0     0.0     0.0     0.0
hdisk1  0.0     0.0     0.0     0.0
hdisk0  77.8K   19.0    0.0     77.8K

評論:

恐怕你把事情搞得太複雜了。提供的解決方案是根據您的輸入樣本和所需輸出的猜測,這確實存在一些不一致之處。請解釋資料hdisk2和的hdisk3來源,因為它們不存在於輸入中。另請解釋建立如此複雜的解決方案的原因,該解決方案將程式碼拆分為多個環境變數。

相關內容