【问题标题】:If string is less than date yields all dates or none如果字符串小于日期,则生成所有日期或无
【发布时间】:2015-06-02 15:04:00
【问题描述】:

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

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

【问题讨论】:

    标签: bash date if-statement while-loop


    【解决方案1】:

    你试图在你的 awk 脚本中使用一个 shell 变量,但却以错误的方式进行。尝试将您的脚本更改为:

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

    这会在 awk 中创建一个变量 d,使用 shell 变量 $deldate 的值。注意$s不是用来访问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

    【讨论】:

    • 宾果游戏,您的第一个解决方案我无法开始工作,但第二个解决方案完美运行,汤姆。我不太明白如何让 mktime 为我工作,这有点超出我的知识范围。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-16
    • 1970-01-01
    • 1970-01-01
    • 2015-11-01
    相关资源
    最近更新 更多