0

运行我的脚本时出现上述错误。试图检查输出的值是否不等于“平均:”。如果不是,则打印到列表文件,如果是则从循环开始。

#!/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
4

2 回答 2

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:的行,而不是任何不完全相似的行。

于 2013-09-09T14:13:29.450 回答
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。)

于 2013-09-09T15:19:18.760 回答