LINUX.ORG.RU

Подсчет разницы во времени между строками лога.

 


0

2

Доброго!

Есть стандартный лог

2017-07-31 12:23:21.000
2017-07-31 12:27:21.000
2017-07-31 12:36:21.000
2017-07-31 12:39:21.000
2017-07-31 12:45:21.000

Нужно найти те строки, в которых разница вов времени по сравнению с предыдущей больше 5 секунд. В выводе нужна предыдущая строка и строка с разницей по отношению к ней больше 5 секунд.

Спасибо.

Ты ошибся разделом, это нужно постить в job.

joy4eg ★★★★★
()

Напишу на Perl за час, $50, обращаться в личку.

r3lgar ★★★★★
()

1) конвертнуть каждую дату в колво миллисекунд от 1970 года (или секунд)

2) вычесть

3) PROFIT!

Deleted
()

man shell

man date

man хоть-что-нибудь, шаровик двоечник!

anonymous
()

Unix Timestamp

Раз

$ date --date='2017-07-31 12:23:21.000' +"%s"
1501475001
Два
$ date --date='2017-07-31 12:27:21.000' +"%s"
1501475241
Три
$ echo $((1501475241-1501475001))
240
Дальше сам

justAmoment ★★★★★
()

В цикле считывай построчно, используй две переменных типа prevtime и time, в конце цикла записывай time в prevtime, а в начале выделяй из строки. Обе, конечно, переводи в unixtime. Ну и между этим вычитай как хочешь, проводи любые рассчёты и выводи на экран или куда тебе надо, как обычно. Это на баше, на питоне можно удобнее. Если всё равно не понятно и надо готовый код — в Job.

Psych218 ★★★★★
()

Буду оригинален

dateutils

anonymous
()
Ответ на: комментарий от Psych218

Да, я так и думал делать, просто это немного громоздко на мой взгляд. Я не шаровик, я пришел посмотреть красивых решений. Знаю, что и sedом, и awkом можно обрабатывать по две строки, используя буфер, просто по ним знаний не хватает.

rusya_rr
() автор топика
Ответ на: комментарий от rusya_rr
timeold="$(date +%s -d "$(head -1 00.00.csv|cut -c -19)")"
cat *.csv|awk -F";" '$13==21 {print $0}' OFS=";"|while read line;do 
current_time="$(date +%s -d "$(echo $line|cut -c -19)")"
delta="$(($current_time - $timeold))"
[[ "$delta" -ge "5" ]] && echo -n "$(date +"%F %R:%S" -d @$timeold) - " && echo $line|cut -c -19
timeold="$current_time" 
done
rusya_rr
() автор топика
Ответ на: комментарий от rusya_rr

У меня только одно уточнение. Если ты решил применять awk, так и напиши вообще всё на awk начиная с парсинга csv.

Примерно в таком ключе:

$ cat 1_csv.awk 
{
	x=substr($0,1,4)" "substr($0,6,2)" "substr($0,9,2)" "substr($0,12,2)" "substr($0,15,2)" "substr($0,18,2);
	t=mktime(x);
	if (NR == 1) {t_old=t; str_old=$0; next;}
	if ( t - t_old > 300 ) {
		print t - t_old "\n" str_old "\n" $0
	}
	t_old=t;
	str_old=$0;
}
$ awk -f 1_csv.awk 1_csv.txt 
540
2017-07-31 12:27:21.000
2017-07-31 12:36:21.000
360
2017-07-31 12:39:21.000
2017-07-31 12:45:21.000
ИМХО: это и выглядит более пристойно (в плане последующей поддержки), и работать будет быстрее (если у тебя там гигабайты логов).

justAmoment ★★★★★
()
Ответ на: комментарий от justAmoment

Спасибо. Почему-то подумал, что на авк все будет выглядеть более элегантно, а тут такой же крокодил.

Спасибо за ликбез!

rusya_rr
() автор топика
Ответ на: комментарий от rusya_rr

Спасибо. Почему-то подумал, что на авк все будет выглядеть более элегантно, а тут такой же крокодил.

Крокодил — это потому что justAmoment awk плохо умеет.

#!/bin/awk -f

BEGIN { FS="[[:space:]]+|[-:.]" }
{
  t=mktime($1" "$2" "$3" "$4" "$5" "$6);
  if (NR != 1) {
        if ( t-t_old > 300 )
                print t - t_old "\n" str_old "\n" $0
  }
  t_old=t; str_old=$0
}
vodz ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.