如何将日期范围作为变量传递给awk

时间:2012-05-25 16:23:35

标签: bash variables awk colon date-range

这是我的情况。

bash ~]# TIME="2012-05-25 06:42:57"
bash ~]# echo "2012-05-25 00:16:51,610" | awk -v var=$TIME '{if ($0 < var) print $0}'

然后,这是错误消息

awk: 06:42:57
awk:   ^ syntax error

我只想将日期范围传递给我的awk命令。如何存档?请帮忙。感谢。

修改案例

START_TIME="2012-05-24 00:00:00"
END_TIME="2012-05-24 01:00:00"
echo "2012-05-24 00:10:10" | awk -v "START=$START_TIME" -v "END=$END_TIME" '{ if ( $0 > START && $0 < END) print $0 }'

似乎无法在IF条件下工作。

awk: { if ( $0 < START && $0 > END) print $0 }
awk:                           ^ syntax error

在serval尝试之后,似乎找到了另一种方法的解决方案。

echo "2012-05-24 00:10:10" | awk '{ if ( $0 > "'"$START_TIME"'" && $0 < "'"$END_TIME"'" ) print $0 }'

不确定如何使用awk变量“-v”。有人有想法吗?

2 个答案:

答案 0 :(得分:7)

在将变量传递给AWK时引用您的变量:

echo "2012-05-25 00:16:51,610" | awk -v "var=$TIME" '{if ($0 < var) print $0}'

答案 1 :(得分:1)

至少在我的系统上,即使对于变量,“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的{​​{1}}函数,因此无法在任何地方使用。

mktime()

为了更容易阅读而空出来,gawk脚本看起来像这样:

[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 ~]$ 

显然,这完全取决于您的日期/时间规范如此匹配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; } 的输入格式。但它适用于你问题中的样本数据。