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