如果string小于date,则生成所有日期或不生成日期

时间:2015-03-29 16:51:39

标签: bash date if-statement while-loop

我有一个带有自定义日期格式的日志文件,我在其中提取日期以查看它们是否在特定时间段之前,如果是,则打印它们。不幸的是,我只能打印一切或什么也不打印。

deldate=$(date +"%m/%d/%Y %T" -d "-92 hours")
awk '{ if ("$6 $7" < "$deldate") print $6, $7}' srbilltest.txt
echo "Delete Date:" $deldate;

源文件示例。

field1 field2 field3 field4 field5 3/24/2015 1:42:00
field1 field2 field3 field4 field5 3/25/2015 1:42:00
field1 field2 field3 field4 field5 3/26/2015 1:42:00
field1 field2 field3 field4 field5 3/27/2015 1:42:00

1 个答案:

答案 0 :(得分:1)

您正在尝试在awk脚本中使用shell变量,但是以错误的方式处理它。尝试将脚本更改为:

deldate=$(date +"%m/%d/%Y %T" -d "-92 hours")
awk -v d="$deldate" '"$6 $7" < d {print $6, $7}' srbilltest.txt

这将使用shell变量d的值在awk中创建变量$deldate。请注意,$不用于访问awk中变量的值; $保留用于访问$6之类的字段。

顺便说一下,我已经从您的awk代码中移除了if,因为awk程序的结构无论如何都是condition { action }

虽然上面的代码解决了在awk中使用shell变量的问题,但还有另一个问题,那就是当年份发生变化时你的比较会失败。您应该考虑将日期格式更改为ISO 8601,以便从年份开始。

或者,如果您使用的是GNU awk,则可以使用mktime,如下所示:

deldate=$(date +%s -d "-92 hours")
awk -v d="$deldate" '{split($6,a,"/");split($7,b,":")}
    mktime(a[3]" "a[1]" "a[2]" "b[1]" "b[2]" "b[3]) < d{print $6, $7}' file

根据其他字段的内容,您可以更改字段分隔符,并避免拨打split