运行我的脚本时出现上述错误。试图检查输出值是否= =“average:”。如果没有,则打印到列表文件,如果是,则从循环开始。
#!/bin/bash
Oad=$(date +%Y_%m_%d.%H.%M.%S)
for i in {1..120}
do
OUTP= uptime | awk '{print $10}' | cut -f1 -d,
echo $OUTP
if $OUTP != average:
then $OUTP >> $Oad.lst
else continue;
fi
sleep 60
done
cat $Oad.lst | awk '{if(min==""){min=max=$1}; if($1>max) {max=$1}; if($1<min) {min=$1}; total+=$1; count+=1} END {print total/count, max, min}' > $Oad.out
答案 0 :(得分:4)
这不是比较它的方法。
if $OUTP != average:
应该是
if [[ $OUTP != average: ]]
某些线条似乎也很奇怪
OUTP= uptime | awk '{print $10}' | cut -f1 -d,
我认为应该是
OUTP=$(uptime | awk '{print $10}' | cut -f1 -d,)
和
then $OUTP >> $Oad.lst
如果要将变量的值发送到文件,则应为
then echo "$OUTP" >> "$Oad.lst"
总的来说,我会建议这样的格式:
#!/bin/bash
Oad=$(date +%Y_%m_%d.%H.%M.%S)
for i in {1..120}; do
OUTP=$(uptime | awk '{print $10}' | cut -f1 -d,)
echo "$OUTP"
if [[ $OUTP != average: ]]; then
echo "$OUTP" >> "$Oad.lst"
sleep 60
fi
done
awk '{if(min==""){min=max=$1}; if($1>max) {max=$1}; if($1<min) {min=$1}; total+=$1; count+=1} END {print total/count, max, min}' "$Oad.lst" > "$Oad.out"
还有一点需要注意。为:
if [[ $OUTP != average: ]]; then
你可能的意思是:
if [[ $OUTP != *average:* ]]; then
匹配任何不包含average:
的行,而不是任何不完全相同的行。
答案 1 :(得分:2)
这只是增加@konsolebox'答案的附加评论,但在单个Awk脚本中执行所有逻辑可能更好。
#!/bin/bash
Oad=$(date +%Y_%m_%d.%H.%M.%S)
for i in {1..120}
do
uptime
sleep 60
done |
awk '$10 != "average" { t=$10; sub(/,.*/,"",t);
if(min=="") min=max=t;
if(t>max) max=t;
if(t<min) min=t;
total += t; count++ }
END {print total/count, max, min}' > $Oad.out
如果您还希望在$Oad.lst
中使用中间结果,则需要进行一些重构,但这不是一个侵入性的更改。 (只需在主循环中打印,然后在END
循环中打开第二个文件句柄。)