【发布时间】: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