尝试在同一行上获得输出,然后执行LOW AVG MAX读取输出。
这是我的功能:
perform_hdparm() {
for i in {1..5}; do hdparm -t "$1"; done |
awk '/seconds/ {print $11}' }
For循环:
for drive in ${hddletter[@]}; do
printf '%s: %s\n' "$drive" "$(perform_hdparm "$drive")"
我做了五次测试,结果如下:
/dev/sdc: 202.69
203.05
203.06
203.20
203.03
所以我想要的是以下内容:
/dev/sdc: 202.69 203.05 203.06 203.20 203.03 LOW: 203.03 HIGH: 203.20 AVG: 203.006
谢谢
答案 0 :(得分:1)
问题是awk中的print
使用输出记录分隔符(ORS
),默认情况下是换行符。如果你想要一个空格,你可以改变它:
awk -v ORS=" " '/seconds/ {print $11}'
或使用printf
代替,这意味着您可以自己选择格式:
awk '/seconds/ {printf "%s ", $11}'
这将打印每个数字,用空格而不是输出记录分隔符分隔它们。
答案 1 :(得分:1)
我会在Awk中完成所有工作。
perform_hdparm() {
for i in {1..5}; do hdparm -t "$1"; done |
awk -v drive="$1" '/seconds/ {a[++i]=$11}
END { printf "%s:", drive;
for(j=1; j<=i; j++) {
s+=a[j]; printf " %f", a[j];
if (j==1) min=max=a[j];
else {
if (a[j]>max) max=a[j];
if (a[j]<min) min=a[j];
}
}
printf "min: %f max: %f avg: %f\n", min, max, s/i; }'
}
for drive in ${hddletter[@]}; do
perform_hdparm "$drive"
done