Мне всегда нравилось это небольшое изображение о дистрибутивах Linux и их отношениях.:)
Никакая потребность сделать сложный парсинг, дата сделает все волшебство для Вас, с помощью его друга, удара:
#!/bin/bash
while read d1_1 d1_2 d2_1 d2_2; do
secdiff=$((
$(date -d "$d2_1 $d2_2" +%s) - $(date -d "$d1_1 $d1_2" +%s)
))
nanosecdiff=$((
$(date -d "$d2_1 $d2_2" +%N) - $(date -d "$d1_1 $d1_2" +%N)
))
printf "%s %s - %s %s = %d milliseconds\n" $d2_1 $d2_2 $d1_1 $d1_2 $((
(secdiff * 1000) + (nanosecdiff / 1000000)
))
done < YOUR_FILE.txt
ВЫВОД
2012-09-13 15:00:29,297 - 2012-09-13 15:00:29,290 = 7 milliseconds
2012-09-13 15:00:29,447 - 2012-09-13 15:00:29,428 = 19 milliseconds
Посмотрите man date
Примечание:
date -d
очень полезно, это преобразовывает метки времени%s
время эпохи (секунды с 01.01.1970)%N
наносекунды$(( ))
и (( ))
для bash
арифметика, см. http://mywiki.wooledge.org/ArithmeticExpression$( )
обозначает command substitution
Это пригодно Ваши потребности также?
Язык сценариев, такой как Perl, Python или Ruby будет быстр и потребует небольшого усилия. Например, с Perl и Датой:: Синтаксический анализ:
perl -MDate::Parse -l -ne 's/,/./g; split; print str2time("$_[2] $_[3]") - str2time("$_[0] $_[1]")'
(Для каждой строки, замены ,
.
, разделите строку на слова $_[0]
через $_[3]
, проанализируйте даты, сформированные первыми двумя и следующими двумя словами, и распечатайте различие.)
Я только что наткнулся на этот пост, есть -по крайней мере сегодня -более простоеdate
-решение. Использование фреймворка в ответе @Gilles Quenot (написало бы комментарий к его ответчику, но недостаточно репутации):
while read d1_1 d1_2 d2_1 d2_2
do
date -d "$d2_1 $d2_2 $(date -d "$d1_1 $d1_2" +%s.%N) seconds ago" +%s.%N
done << END
2012-09-13 15:00:29,290 2012-09-13 15:00:29,297
END
Результат:
$./time_elapsed.sh
0.007000000
Использование %3N
вместо %N
приведет к усечению вывода до миллисекунд.