bash - 如何计算平均响应时间 Bash 脚本
问题描述
我有一个 bash 脚本,它正在计算给定日志中特定 java 方法的响应时间。该脚本由 2 个循环组成,其中一个循环遍历最后 5 分钟for (( i = 5; i > 0 ; i--))
,并确定第二个循环所需的“ID”,以便我可以匹配开始和结束时间。在第二个循环中,我正在计算diff = $(($endTime - $startTime)); echo $diff
现在我想从过去 5 分钟的所有结果中获取平均响应时间。如果我调用我的脚本,这可以使用 awk 轻松完成./responseTime.sh | awk '{sum+=$1} END {print sum / NR}'
如何在不使用此管道的情况下计算平均值(我不知道它每运行 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]
解决方案
对于简单的数学运算,您可以使用 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))"
推荐阅读
- android - Firebase 不使用“gdx-fireapp”删除事件监听器
- python - 将数组中的重复行折叠成一个唯一行
- html - 选中
- 宽度不同
- constructor - 在 Julia 的函数 ccall 上构造对象
- angular - 如何动态生成并仅显示primeng表中存在并在数组中有数据的列
- azure - 尝试通过 Azure REST API 在 AAD 中提升访问权限时出现访问错误
- python - 重构:“提取方法”错误和意外结果
- javascript - 将变量从节点传递到本地 javascript 文件的最佳方式
- node.js - 如何将 Angular 前端和 Node 后端合并到一个 git 存储库中?
- plsql - 创建循环以在 oracle SQL 中传递变量数组