Bash:解析命令时间的“真实”输出,检查输出字符串,添加时间戳并将其发送到输出文件

Bash:解析命令时间的“真实”输出,检查输出字符串,添加时间戳并将其发送到输出文件

不是剧本人。我正在尝试构建一个重复测试,以查看命令运行需要多长时间,标记它是否成功,并添加时间戳,并将所有内容附加到日志文件中。

哦,这是在 Mac 上的 bash 中。

为了尝试解析出“真实的”,我尝试过以下方法:

time ./login.sh | sed -n 's/.*real://p' >> output.txt

或者

(time ./login.sh) 1> /dev/null 2> output.txt

login.sh 脚本运行,并在其中附加“成功”或“失败”:

application login -u "user" -p '******' "host.domain.com" | grep "Succeeded" &> /dev/null
if [ $? == 0 ]; then
    echo "  Suceeded" >> output.txt
else
    echo "  Failed" >> output.txt
fi

我将把所有这些都放入带有 sleep 命令的 For 循环中,以便它每 5 分钟发生一次:

for n in {1..1000};
do
    # Command that Adds the time stamp
    # the command to find the real time above once I get it working
    sleep 5m
done

期望的输出类似于:

Sun Jul 29 16:15:06 PDT 2019 real   0m0.815s  Suceeded
Sun Jul 29 16:20:06 PDT 2019 real   0m0.635s  Suceeded
Sun Jul 29 16:25:06 PDT 2019 real   0m1.053s  Suceeded
Sun Jul 29 16:30:06 PDT 2019 real   0m15.653s  Failed

答案1

使用/usr/bin/time而不是 shell 内置的time.然后将命令捕获到stderr一个单独的文件中。由于经过的实时时间是输出的第一个字,因此很容易使用 来获取。stdoutapplicationtimeawk

grep有一个-q开关,因此无需重定向到/dev/null.

最后,sleep在几秒钟内接受一个参数,所以我认为sleep 5m这不会做你想要的事情。不过语法是可以接受的,所以我就保留它。

for n in {1..1000}
do

    /usr/bin/time application login -u "user" \
             -p '******' "host.domain.com" > login.out 2>time.out

    realtime=$(awk '{print $1}' time.out)

    echo -n "$(date) real $realtime " >> output.txt

    if grep -q "Succeeded" login.out; then
        echo "Succeeded" >> output.txt
    else
        echo "Failed"   >> output.txt
    fi

    sleep 5m

done

答案2

不要 grep/awk/sed,只使用时间的格式选项,例如time -f "%e" command将仅输出命令所花费的实际秒数,仅此而已。

相关内容