【问题标题】:How to calculate average response time Bash script如何计算平均响应时间 Bash 脚本
【发布时间】:2020-01-19 17:42:25
【问题描述】:

我有一个 bash 脚本,用于计算给定日志中特定 java 方法的响应时间。 该脚本由 2 个循环组成,一个循环通过最后 5 分钟 for (( i = 5; i > 0 ; i--)) 并识别第二个循环所需的“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
cat examples.txt

[Jan12 18:26:00] Initialized session for folderId:8005
[Jan12 18:26:15] Starting process [8005]
[Jan12 18:27:00] Initialized session for folderId:8004
[Jan12 18:27:17] Starting process [8004]
[Jan12 18:28:00] Initialized session for folderId:8003
[Jan12 18:28:16] Starting process [8003]
[Jan12 18:29:00] Initialized session for folderId:8002
[Jan12 18:29:15] Starting process [8002]
[Jan12 18:30:00] Initialized session for folderId:8001
[Jan12 18:30:12] Starting process [8001]
[Jan12 18:31:00] Initialized session for folderId:8000
[Jan12 18:31:16] Starting process [8000]
[Jan12 18:26:31] process finished [8005]
[Jan12 18:27:41] process finished [8004]
[Jan12 18:28:55] process finished [8003]
[Jan12 18:29:49] process finished [8002]
[Jan12 18:30:33] process finished [8001]
[Jan12 18:31:35] process finished [8000]

【问题讨论】:

  • 您能否设置一个最小工作示例,以便任何人都可以复制、粘贴、尝试、编辑并可能回答您的问题?
  • @EnricoMariaDeAngelis 添加了更多信息,希望对您有所帮助。
  • Bash 没有浮点数,但将所有这些写成单个 Awk 脚本可能会更好。如果没有您输入的样本,很难确切知道如何重构它。特别是,每个日志条目的时间戳以什么形式和在哪个字段中?
  • @KristianSlavov,您也可以自己编写一个简单的示例日志文件并将其添加到问题中。但是,正如@tripleee 所提到的,如果您必须处理浮点数,bash 不是正确的工具。 awk 是,而且原则上它可以完成整个任务。
  • 您在每行输入中使用awk(以及sed 和???其他子进程)来计算您的结果。你之前的Q,都在awk 是解决这类问题的方法。我看到你不需要帮助将你的bash 代码翻译成awk,所以最好在使用awk 遇到任何问题时发布一个 Q。祝你好运。

标签: bash


【解决方案1】:

对于简单的数学运算,您可以使用 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))"

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-31
    • 1970-01-01
    • 2021-03-24
    相关资源
    最近更新 更多