shell脚本监视磁盘IO无法正常工作

时间:2013-11-14 07:19:59

标签: linux bash shell sed awk

我要使用sar命令监视磁盘IO,需求在输出中 1)如果任何磁盘的%busy超过80%,磁盘名称和如果所有磁盘都低于阈值,那么值应显示在第1行,然后输出应该只显示'ok' 2)如果%busy超过60%但是低于80%的任何磁盘,磁盘名称和如果所有磁盘都低于阈值,则值应显示在第2行,然后输出应显示“ok”

我已经准备好了下面的脚本,但它无法正常显示1个磁盘的某些磁盘未找到错误,只显示'ok'

你可以帮我修改我的剧本并帮助我实现目标

这是我的脚本

`bash-3.00$ cat diskio.sh

 #!/bin/bash
a=`sar -d 2 2 |sed -n '/Average/,$ {s/Average//g;p;}'`
e=`$a|awk 'NR> 1{ if ($2 >80)  { print $1, $2; f=1; }  }  
    END { if (!f) print "ok" }'`
w=`$a|awk 'NR> 1{ if ($2 <80 && $2 >60)  { print $1, $2; f=1; }  }
    END { if (!f) print "ok" }'`
echo $e
echo $w`

以下是输出

`bash-3.00$ diskio.sh
./diskio.sh: line 3: hdisk18:  command not found.
./diskio.sh: line 4: hdisk18:  command not found.
ok
ok`

TIA 问候, tnt5273

2 个答案:

答案 0 :(得分:3)

您应该使用括号$(code)而不是后退抽搐和echo<<<来获取变量:

e=$(awk 'NR>1 {if ($2>40) {print $1,$2; f=1}} END {if (!f) print "ok"}' <<<"a$")

e=$(echo "$a" | awk 'NR>1 {if ($2>40) {print $1,$2; f=1}} END {if (!f) print "ok"}')

并且总是在变量周围使用双引号:echo $a错误,echo "$a"确定

答案 1 :(得分:2)

您应该在echo之前的$a添加以下两行:

e=`$a|awk 'NR> 1{ if ($2 >40)  { print $1, $2; f=1; }  }  
END { if (!f) print "ok" }'`
w=`$a|awk 'NR> 1{ if ($2 <40 && $2 >20)  { print $1, $2; f=1; }  }
END { if (!f) print "ok" }'`

这样他们看起来像这样:

e=`echo $a|awk 'NR> 1{ if ($2 >40)  { print $1, $2; f=1; }  }  
END { if (!f) print "ok" }'`
w=`echo $a|awk 'NR> 1{ if ($2 <40 && $2 >20)  { print $1, $2; f=1; }  }
END { if (!f) print "ok" }'`

目前,您只有$ahdisk18开头,bash将其作为命令互相交配,而您想要做的是回显$a中的值并将其传递给awk