Как рассчитать среднее время ответа Bash скрипт - PullRequest
1 голос
/ 12 января 2020

У меня есть скрипт bash, который вычисляет время отклика для определенных c java методов из данного журнала. Сценарий состоит из 2 циклов, один перебирает последние 5 минут for (( i = 5; i > 0 ; i--)) и идентифицирует «идентификаторы», которые мне нужны для второго l oop, чтобы я мог сопоставить время начала и окончания. На втором l oop я делаю вычисления 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]

1 Ответ

1 голос
/ 18 января 2020

Для простой математики вы можете использовать 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))"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...