2017-02-15 30 views
-1

Что является наиболее эффективным метод для подсчета, мера (высчитывает) timespans между двумя отметками из логфайла? Я знаю глупое решение в Excel/Numbers/Refine, но я ищу умный awk-oneliner.Что лучший метод для измерения timespans между двумя отметками

Пример: Лифт с автоматической дверной системой работает на n этажах.

лифта открывает дверь:

Start Move to Work_position

Дверь лифта открыта:

End Move to Work_position

лифт закрывает дверь

Start Move to Home_Position End Move to Home_Position

В (приготовленный) логфайл:
Elevator_021 logger: 2017-02-13 13:11:33.735 [MONITORING] CYL_A1; Floor_12 Door ;Start Move to Work_position 
Elevator_021 logger: 2017-02-13 13:11:34.800 [MONITORING] CYL_A1; Floor_12 Door ;End Move to Work_position 

Elevator_021 logger: 2017-02-13 13:26:12.893 [MONITORING] CYL_A1; Floor_12 Door ;Start Move to Home_Position 
Elevator_021 logger: 2017-02-13 13:26:13.898 [MONITORING] CYL_A1; Floor_12 Door ;End Move to Home_Position 

Elevator_021 logger: 2017-02-13 14:51:03.211 [MONITORING] CYL_A1; Floor_12 Door ;Start Move to Work_position 
Elevator_021 logger: 2017-02-13 14:51:04.276 [MONITORING] CYL_A1; Floor_12 Door ;End Move to Work_position 

Я направляюсь к выходу, как это:

Elevator_021 logger: 2017-02-13 13:11:33.735 [MONITORING] CYL_A1; Floor_12 Door ;Start Move to Work_position 
Elevator_021 logger: 2017-02-13 13:11:34.800 [MONITORING] CYL_A1; Floor_12 Door ;End Move to Work_position 
to Work 1065 ms 

Elevator_021 logger: 2017-02-13 13:26:12.893 [MONITORING] CYL_A1; Floor_12 Door ;Start Move to Home_Position 
Elevator_021 logger: 2017-02-13 13:26:13.898 [MONITORING] CYL_A1; Floor_12 Door ;End Move to Home_Position 
to Home 1005 ms 

Elevator_021 logger: 2017-02-13 14:51:03.211 [MONITORING] CYL_A1; Floor_12 Door ;Start Move to Work_position 
Elevator_021 logger: 2017-02-13 14:51:04.276 [MONITORING] CYL_A1; Floor_12 Door ;End Move to Work_position 
to Work 3976 ms 

ответ

1

Вы можете использовать gawk сделать что-то вроде:

awk 'function dtime(s) { 
     x=match($0, /([0-9]{4}-[0-9]{2}-[0-9]{2}\s[0-9:]+)(\.[0-9]+).*([0-9]{4}-[0-9]{2}-[0-9]{2}\s[0-9:]+)(\.[0-9]+).*(to \w+)_/, arr) 
     if (x) { 
       s1=arr[1] 
       s2=arr[3] 
       gsub(/[-:]/, " ", s1) 
       gsub(/[-:]/, " ", s2) 
       t1=mktime(s1)+arr[2] 
       t2=mktime(s2)+arr[4] 
       return arr[5] " " (t2-t1)*1000 " ms" 
     } 
     else 
       return "" 
     } 
BEGIN {RS=ORS="\n\n"} 
     {print $0 " -> " dtime($0) }' file 

гравюр:

Elevator_021 регистратор: 2017-02-13 13: 11: 33.735 [МОНИТОРИНГ] CYL_A1; Этаж_12 Дверь, Начало Переместить в Рабочую_позицию Elevator_021 logger: 2017-02-13 13: 11: 34.800 [МОНИТОРИНГ] CYL_A1; Floor_12 Дверь, конец Переместить в Рабочую_позицию -> Работать 1065 мс

Elevator_021 logger: 2017-02-13 13: 26: 12.893 [МОНИТОРИНГ] CYL_A1; Floor_12 Door, Start Перейдите к Home_Position Elevator_021 logger: 2017-02-13 13: 26: 13.898 [МОНИТОРИНГ] CYL_A1; Floor_12 Door; End Переместить в Home_Position -> в начало 1005 мс

Elevator_021 logger: 2017-02-13 14: 51: 03.211 [МОНИТОРИНГ] CYL_A1; Этаж_12 Дверь, Начало Переместить в Рабочую_позицию Elevator_021 logger: 2017-02-13 14: 51: 04.276 [МОНИТОРИНГ] CYL_A1; Floor_12 Дверь, конец Переместить в Work_position -> для работы 1065 мс

+0

thx! Но, нет! \t awk: синтаксическая ошибка в исходной строке 2 в функции dtime context is x = match ($ 0,/([0-9] {4} - [0-9] {2} - [0-9] {2} \ s [0-9:] +) (\. \t [0-9] +). * ([0-9] {4} - [0-9] {2} - [0-9] { 2} \ s [0-9:] +) (\. [0-9] +). * (To >>> \ w +) _ /, <<< awk: незаконный оператор в исходной строке 2 \t в функции dtime awk: незаконный оператор в исходной строке 2 в Funktion stimme –

+0

Он будет далек от 1 лайнера в POSIX awk, поскольку он не имеет временных функций. Вы можете исследовать с помощью 'date' для преобразования временной метки или использовать Perl или install gawk. – dawg

+0

Он работает - переключается на другую машину OS-X. Но только с «предварительной группировкой» связанных строк - нужна одна пустая строка между связанными парами. –