这是我的变量:
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
来源,因为它们不存在于输入中。另请解释构建如此复杂的解决方案的原因,该解决方案将代码拆分为多个环境变量。