BASH awk与for循环在同一行上输出?

时间:2014-05-20 15:47:40

标签: bash awk

尝试在同一行上获得输出,然后执行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

谢谢

2 个答案:

答案 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