如果字符串小于日期,则生成所有日期或 none

If string is less than date yields all dates or none

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

deldate=$(date +"%m/%d/%Y %T" -d "-92 hours")
awk '{ if (" " < "$deldate") print , }' 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

您正试图在 awk 脚本中使用 shell 变量,但使用的方式不对。尝试将您的脚本更改为:

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

这会在 awk 中创建一个变量 d,使用 shell 变量 $deldate 的值。请注意 $s 不用于访问 awk 中变量的值; $ 保留用于像您所做的那样访问 </code> 等字段。</p> <p>顺便说一句,我已经从你的 awk 代码中删除了 <code>if,因为 awk 程序的结构无论如何都是 condition { action }

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

或者,如果您使用的是 GNU awk,您可以像这样使用 mktime

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

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