Лучшее решение - использовать awk
для этого. Что вам нужно сделать, это конвертировать ваши метки времени в Unix-время, а затем сделать сравнение. В awk
вы можете сделать это, используя mktime()
mktime(datespec [, utc-flag ])
: Превратить даты в метку времени в той же форме, что и systime()
. Это похоже на
функция с тем же именем в ISO C. Аргумент, datepec, является
строка вида YYYY MM DD HH MM SS [DST]
. Строка состоит из
шесть или семь чисел, представляющих, соответственно, полный год
в том числе век, месяц с 1 по 12, день месяца с 1
до 31, часы дня от 0 до 23, минуты от 0 до 59,
секунда от 0 до 60,55 и дополнительный флаг перехода на летнее время.
Чтобы преобразовать формат времени формы 20/Apr/2018:14:25:37 +0000
в 2018 04 20 14 25 37 +0000
awk -v tstart="20/Apr/2018:14:25:00" -v tend = "20/Apr/2018:20:43:00" \
'function tounix(str) {
split(str,a,"/|:| ")
return mktime(a[3]" "month[a[2]]" "a[1]" "a[4]" "a[5]" "a[6])
}
BEGIN{
month["Jan"]="01";month["Feb"]="02";month["Mar"]="03"
month["Apr"]="04";month["May"]="05";month["Jun"]="06"
month["Jul"]="07";month["Aug"]="08";month["Sep"]="09"
month["Oct"]="10";month["Nov"]="11";month["Dec"]="12"
FS="\\[|\\]"
t1=tounix(tstart)
t2=tounix(tend)
}
{ t=tounix($2) }
(t1<=t && t<=t)' <file>
Этот метод является надежным, поскольку он будет выполнять сравнение реального времени, которое не зависит от високосных годов, переходов между днями / месяцами / годами ... В отличие от других предоставленных решений, этот метод также не требует наличия дата tstart
и tend
в file