2014-09-04 5 views
0

Я лог-файл в виде, как показано ниже:время Counting в лог-файл

log.txt

Unavailable 06.08.2014 23:59:36 - 07.08.2014 00:00:36 
Unavailable 15.08.2014 04:53:32 - 15.08.2014 04:53:32 
Available 15.08.2014 04:54:32 - 15.08.2014 05:17:32 
Unavailable 15.08.2014 05:18:32 - 15.08.2014 05:18:32 
Unavailable 15.08.2014 08:22:00 - 15.08.2014 08:22:00 
Available 15.08.2014 08:23:00 - 17.08.2014 01:44:27 
Unavailable 17.08.2014 01:45:27 - 17.08.2014 01:52:33 
Available 17.08.2014 01:53:33 - 02.09.2014 11:07:21 

мне нужно посчитать время недоступности в секундах. Я не какой-либо СЕПГ/AWK гуру так что мой apporach этой проблемы очень просто:

cat log.txt | grep "Unav" | sed -r 's/\<Unavailable\>//g;s/:/ /g;s/\./ /g' | 
awk -F- '{d2=mktime($2);d1=mktime($1);print d2-d1;}' | awk '{s+=$1} END {print s}' 

Я был удивлен, видя, что, когда дата попадались день (корыто полночь) расчет идет не так. Результат от расчета первой строки показывает, что разница была секунд в EPOCH, поэтому будет Чт 31 декабря 01:01:00 CET 1970. Но результат расчета должен составлять 60 секунд. Может ли кто-нибудь объяснить мне, почему этот результат был возвращен из системы?

ответ

3

Вам не нужно все это sed и grep, если вы собираетесь использовать awk. Кроме того, разница должна составлять 60 секунд, как показано на примере данных образца.

С man страницы:

указываете ей (datespec) Включите datespec в отметку времени в той же форме, как это возвращаемое SysTime(). Он похож на функцию с тем же именем в ISO C. Аргумент datepec является строкой формы «YYYY MM DD HH MM SS [DST]».

Попробуйте следующую команду:

awk ' 
$1 == "Unavailable" { 
    split ($2, d1, /[.]/); 
    split ($3, t1, /:/); 
    split ($5, d2, /[.]/); 
    split ($6, t2, /:/); 
    end = mktime (d2[3]" "d2[2]" "d2[1]" "t2[1]" "t2[2]" "t2[3]) 
    start = mktime (d1[3]" "d1[2]" "d1[1]" "t1[1]" "t1[2]" "t1[3]) 
    print end - start 
}' log.txt 
60 
0 
0 
0 
426 

Это будет печатать разницу в секундах. Если вы хотите распечатать вывод в другом формате, вы можете использовать функцию strftime из библиотеки GNU awk.

+1

Как я уже сказал, я не awk-гуру, но вижу, что вы очень благодарны. – michalp

+1

Поскольку я не мог продвигать ваш комментарий в «ответе, опубликованном от вас, где вы знаете», я делаю это здесь: D – fedorqui

0

В моей системе man awkmktime(datespec) требует формат YYYY MM DD HH MM SS. Но вы проезжаете 06 08 2014 23 59 36, у которого год и день меняются местами. Вам нужно будет изменить поля.