至少在我的系统上,“END”似乎是一个保留字,即使对于变量也是如此。awk 使用 END 就像使用 BEGIN 一样,但我之前没有看到有人尝试将它用作变量。笔记:
[ghoti@pc ~]$ START_TIME="2012-05-24 00:00:00"
[ghoti@pc ~]$ END_TIME="2012-05-24 01:00:00"
[ghoti@pc ~]$ echo "2012-05-24 00:10:10" | awk -v "START=$START_TIME" -v "END=$END_TIME" '{ if ( $0 < START && $0 > END) print $0 }'
awk: syntax error at source line 1
context is
{ if ( $0 < START && $0 > >>> END <<< ) print $0 }
awk: illegal statement at source line 1
[ghoti@pc ~]$ echo "2012-05-24 00:10:10" | awk -v s_time="$START_TIME" -v e_time="$END_TIME" '{ if ( $0 < s_time && $0 > e_time) print $0 }'
[ghoti@pc ~]$
显然这仍然不起作用,但现在它不起作用是因为对比较如何工作的误解,而不是因为我们试图使用保留字作为变量。
查看您的if
陈述,您似乎仅在比较字符串在开始日期之前和结束日期之后才尝试评估 TRUE 。除非时间是循环的理论,我认为我们可以假设这种逻辑是有缺陷的。
所以这就是我想出的。请注意,这使用gawk
'mktime()
功能,因此它不会在任何地方都有效。
[ghoti@pc ~]$ START_TIME="2012-05-24 00:00:00"
[ghoti@pc ~]$ END_TIME="2012-05-24 01:00:00"
[ghoti@pc ~]$ printf '2012-05-23 22:10:10\n2012-05-24 00:10:10\n2012-05-24 01:10:10\n' | gawk -v s_time="$START_TIME" -v e_time="$END_TIME" 'BEGIN { s=mktime(gensub(/[^0-9]/," ","G",s_time)); e=mktime(gensub(/[^0-9]/," ","G",e_time)); } { now=mktime(gensub(/[^0-9]/," ","G")); if ( now > s && now < e) print $0 }'
2012-05-24 00:10:10
[ghoti@pc ~]$
为了便于阅读,gawk 脚本如下所示:
BEGIN {
s=mktime(gensub(/[^0-9]/," ","G",s_time));
e=mktime(gensub(/[^0-9]/," ","G",e_time));
}
{
now=mktime(gensub(/[^0-9]/," ","G"));
if ( now > s && now < e) print $0;
}
显然,这完全依赖于您的日期/时间规范与mktime()
' 的输入格式非常匹配的事实。但它适用于您问题中的示例数据。