我搜索并找到了几种方法来检查时间戳是否介于两个时间戳之间,但所有的方法假设 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?
发布于 2019-12-20 09:10:39
具体来说,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的S [[ < / > ]]操作符使用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将打印以该范围内的时间戳开头的行。
https://unix.stackexchange.com/questions/558204
复制相似问题