타임스탬프가 두 타임스탬프 사이에 있는지 확인하는 여러 가지 방법을 검색하고 찾았지만 모든 방법방법 가정 HH:MM:SS
형식만 고려하지 말고 형식만 고려하세요.날짜.
내 실제 시나리오는 날짜 및 밀리초를 포함한 일반적인 형식의 로그 파일의 입력 타임스탬프입니다 2019-11-11 19:05:55,823
.
주어진 타임스탬프가 있다고 가정합니다 2019-11-11 19:05:55,823
. 그것이 범위 내에 있는지 밖에 있는지 어떻게 확인합니까?
2019-11-11 17:02:54,479
2019-11-12 05:13:55,998
?
답변1
특히 bash의 경우 문제가 될 것입니다.
start='2019-11-11 17:02:54,479'
end='2019-11-12 05:13:55,998'
date='2019-11-11 19:05:55,823'
if LC_ALL=C command eval '[[ ! $date < $start && ! $date > $end ]]'; then
echo the date is in the range
fi
이는 어휘 비교를 수행합니다. 이는 C 로케일에서 이러한 날짜 표현이 어휘 및 시간순으로 동일하기 때문에 작동합니다.
bash
연산자는 문자열을 비교 [[ < / > ]]
하는 데 사용되므로 strcoll()
지역화된 정렬 알고리즘이 사용됩니다. C 로케일에서는 strcoll()
와 같은 의미입니다 strcmp()
. 다른 로케일에서는 해당 로케일의 규칙에 따라 비교하므로 결과에 대해 많은 보장을 받을 수 없습니다.
POSIXly에서는 다음을 사용할 수 있습니다.
if LC_ALL=C expr "x $date" '>=' "x $start" '&' "x $date" '<=' "x $end" > /dev/null; then
echo the date is in the range
fi
awk
이제 로그 파일로 작업하는 경우 타임스탬프가 각 줄의 시작 부분에 있다고 가정하여 이 작업을 수행할 수 있습니다 .
LC_ALL=C awk -v start='2019-11-11 17:02:54,479' \
-v end='2019-11-12 05:13:55,998' '
$0 >= start && $0 <= end' < file.log
이 범위의 타임스탬프로 시작하는 줄이 인쇄됩니다.