如何计算Bash脚本的平均响应时间

如何计算Bash脚本的平均响应时间,bash,Bash,我有一个bash脚本,它根据给定的日志计算特定java方法的响应时间。 该脚本由两个循环组成,一个循环在((i=5;i>0;i--)的最后5分钟内进行迭代,并标识第二个循环所需的“ID”,以便匹配开始和结束时间。在第二个循环中,我正在进行计算diff=$($endTime-$startTime));echo$diff 现在我想从过去5分钟的所有结果中获得平均响应时间。如果我调用脚本/responseTime.sh | awk'{sum+=$1}END{print sum/NR}',这可以很容易地

我有一个bash脚本,它根据给定的日志计算特定java方法的响应时间。 该脚本由两个循环组成,一个循环在((i=5;i>0;i--)的最后5分钟内进行迭代,并标识第二个循环所需的“ID”,以便匹配开始和结束时间。在第二个循环中,我正在进行计算
diff=$($endTime-$startTime));echo$diff

现在我想从过去5分钟的所有结果中获得平均响应时间。如果我调用脚本
/responseTime.sh | awk'{sum+=$1}END{print sum/NR}',这可以很容易地用awk完成。
如果不使用此管道,我如何计算平均值(我不知道每运行5分钟会得到多少结果)

我没有这样的日志在我的本地机器上显示它是如何工作的。这是我的剧本

#!/bin/bash

logfile=/var/log/examples.txt

#loop through last 5 min

  for (( i = 5; i >=0; i-- ))

    do

     debugDate=$(date --date="$i minutes ago" "+%b%d %H:%M")
     folderId=$(grep "$debugDate" $logfile  | sed -rn '/.*folderId:([^ ]*).*/ s//\1/p' ) # identify id's and store results

      for j in $folderId

       do

        startTime=$(grep "$j" $logfile | grep "Starting" | awk '{split ($2,Time,":"); print Time[1]*3600000+Time[2]*60000+Time[3]*1000}') #get the value in ms
        endTime=$(grep "$j" $logfile | grep "process finished" | awk '{split ($2,Time,":"); print Time[1]*3600000+Time[2]*60000+Time[3]*1000}')

      if [ ${#startTime} -ne 8 ] || [ ${#endTime} -ne 8 ] #exclude midnight results and retries

      then

         continue

      fi

       responseTime=$(($endTime - $startTime))
       echo $responseTime #test results

      done

  done

对于简单的数学,可以使用bash内置。请注意,bash并没有浮点数学,所以您将以完整的秒分辨率获得结果

sum=0
count=0
for (( i = 5; i >=0; i-- ))
do
   ...
   Original Loop Here
   responseTime=$(($endTime - $startTime))
   echo $responseTime #test results
   ...
   # Update sum and count
   sum=$((sum+responseTime))
   count=$((count+1))   
done
# Print Average
[ "$count" -gt 0 ] && echo "Average: $((sum/count))"

您能否设置一个最小的工作示例,以便任何人都可以复制、粘贴、尝试、编辑并可能回答您的问题?@EnricoMariaDeAngelis添加了一些信息,希望能有所帮助。Bash没有浮动,但所有这些都最好作为单个Awk脚本编写。如果没有输入样本,就很难准确地知道如何重构它。特别是,每个日志条目的时间戳是以什么形式和在哪个字段中?@KristianSlavov,您也可以自己编写一个简单的日志文件示例,并将其添加到问题中。然而,正如@tripleee所提到的,
bash
不是处理浮点数的合适工具
awk
是,原则上它可以完成整个任务。您在每一行输入上使用
awk
(和
sed
和???其他子流程)来计算您的结果。你以前的Q,all in
awk
就是解决这类问题的方法。我知道您在将
bash
代码翻译为
awk
时不需要帮助,因此最好在使用
awk
遇到任何问题时发布一个Q。祝你好运
sum=0
count=0
for (( i = 5; i >=0; i-- ))
do
   ...
   Original Loop Here
   responseTime=$(($endTime - $startTime))
   echo $responseTime #test results
   ...
   # Update sum and count
   sum=$((sum+responseTime))
   count=$((count+1))   
done
# Print Average
[ "$count" -gt 0 ] && echo "Average: $((sum/count))"