Как найти среднее время из файла журнала для конкретной строки с шаблоном - PullRequest
0 голосов
/ 01 июня 2018

У меня есть журналы со следующим шаблоном, мне нужен сценарий оболочки, который может выполнить поиск шаблона Forged new block id и вычислить среднее время из столбца метки времени для соответствующего шаблона Forged new block id.

[inf] 2018-06-01 07:32:20 | Forged new block id: 17422268043238265953 height: 6 round: 1 slot: 6372914 reward: 0
[inf] 2018-06-01 07:32:30 | Forged new block id: 12637471709620273874 height: 7 round: 1 slot: 6372915 reward: 0
[inf] 2018-06-01 07:33:31 | Forged new block id: 9854455515089974346 height: 13 round: 1 slot: 6372921 reward: 0
[inf] 2018-06-01 07:35:34 | Forged new block id: 9528299565814967922 height: 25 round: 1 slot: 6372933 reward: 0
[inf] 2018-06-01 07:37:44 | Forged new block id: 4030154355419311374 height: 38 round: 1 slot: 6372946 reward: 0
[inf] 2018-06-01 07:38:34 | Forged new block id: 15961811681976216620 height: 43 round: 1 slot: 6372951 reward: 0
[inf] 2018-06-01 07:39:03 | Forged new block id: 18327854550540255433 height: 46 round: 1 slot: 6372954 reward: 0
[inf] 2018-06-01 07:43:05 | Forged new block id: 6436183970195006511 height: 70 round: 1 slot: 6372978 reward: 0
[inf] 2018-06-01 07:44:34 | Forged new block id: 2865139280099855691 height: 79 round: 1 slot: 6372987 reward: 0
[inf] 2018-06-01 07:45:45 | Forged new block id: 5462796790425133759 height: 86 round: 1 slot: 6372994 reward: 0

Ожидаемый результат - разница во времени между текущей строкой и ее предыдущей строкой. Допустим, 2018-06-01 07:32:20 это первая строка, а это вторая строка 2018-06-01 07:32:30, поэтому разница во времени равна 10 seconds, а среднее значение будет суммой всехразница и делится на общее количество строк

Ответы [ 3 ]

0 голосов
/ 01 июня 2018

Вы можете использовать этот скрипт GNU awk:

$ awk '/Forged new block id/{timestr=$2" "$3;gsub(/[-:]/," ",timestr);t1=mktime(timestr);if(t2) {diff=t1-t2;print diff} t2=t1; total+=diff} END{print "average=" total/NR}' file
10
61
123
130
50
29
242
89
71
average=80.5

Скрипт преобразует 2-е и 3-е поля в строку даты, понятную команде mktime awk.

Разница в метках времени рассчитывается на основе последней строки.

END выводит среднее значение в секундах.

0 голосов
/ 01 июня 2018

Просто конвертируйте время в метки времени и делайте с ними математические вычисления.

например.поверните человека в эпоху (например, «28 апреля 07:50:01» к 1524916201), а затем вычтите их, добавьте их или что-то еще.

В этом примере у меня есть функция, которая будет читаться из «человека», еслиВы будете к отметке времени и обратно.Я нашел это полезным, когда написал сценарий, в котором говорилось, когда начинаются кроны и когда они действительно заканчиваются.

Пример: преобразование из функции человека в эпоху

#!/bin/bash
# -- Converts from human to epoch or epoch to human, 
#    specifically this format: "Apr 28 07:50:01" human.
#    typeset now=$(date +"%s")
#    typeset now_human_date=$(convert_cron_time "human" "$now")

function convert_cron_time() {
    case "${1,,}" in
        epoch)
            # human to epoch (eg. "Apr 28 07:50:01" to 1524916201)
            echo $(date -d "${2}" +"%s")
            ;;
        human)
            # epoch to human (eg. 1524916201 to "Apr 28 07:50:01")
            echo $(date -d "@${2}" +"%b %d %H:%M:%S")
            ;;
    esac
}


now=$(date +"%s")
time_range=604800   #one week in seconds
start=$now
finish=$((($now+$time_range)))


start_human=$(convert_cron_time "human" "$start")
finish_human=$(convert_cron_time "human" "$finish")

start_epoch=$(convert_cron_time "epoch" "$start_human")
finish_epoch=$(convert_cron_time "epoch" "$finish_human")

echo "$start_human / $start_epoch"
echo "$finish_human / $finish_epoch"

another=$(convert_cron_time "epoch" "2018-06-01 07:32:20")
another_human=$(convert_cron_time "human" "$another")
echo "another ex: $another / $another_human"

Вывод:

Jun 01 08:47:34 / 1527857254
Jun 08 08:47:34 / 1528462054
another ex: 1527852740 / Jun 01 07:32:20

Следовательно, в цикле for вы можете добавить все поля вверх или сделатьСравнения, как вы читаете файл.В вашем случае вы должны вычесть временные метки, взять разницу в секундах и что-то с ними сделать (например, конвертировать в минуты / часы и т. Д.)

0 голосов
/ 01 июня 2018

Вы можете использовать это awk для расчета среднего времени:

awk 'function getSec(s) {
   cmd = "date +%s -d \"" s "\""
   cmd | getline d
   close( cmd )
   return d
}
/Forged new block id/ {
   ++n
   ts = $2 OFS $3
   if (n == 1)
      start = ts
}
END {
   print (getSec(ts) - getSec(start)) / n
}' file

80.5

Демонстрация работы в Интернете

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...