首页 > 解决方案 > 在 awk 参数中使用 date 命令

问题描述

我有一个看起来像这样的文件

server1-adm.test.com,/var,dir,29987,2007-12-03 15:52:43,root,root
server2.fs.com,/DATA_File.out,file,299076487,2008-10-15 05:12:23,user1,group1
server3-prd.mod.com,/opt,dir,29987,2009-05-03 00:13:23,user1,group1
server4,/var/tmp/xxz.zip,file,400,2007-12-03 15:52:43,root,root
server1-adm.test.com,/usr,dir,34299876,2006-12-03 16:52:43,root,root
server3-prd.mod.com,/local/home,dir,400,2009-05-03 12:13:23,user2,group1

第 5 列是date + time我要修改的值。我尝试将多个 awk 语句一起使用,但看起来太混乱了,容易出错。我如何使用dateawk 中的系统命令来转换为以下结果,而不是使用多个语句进行日期格式转换。

server1-adm.test.com,/var,dir,29987,2007-12-03 03:52:43 PM,root,root
server2.fs.com,/DATA_File.out,file,299076487,2008-10-15 05:12:23 AM,user1,group1
server3-prd.mod.com,/opt,dir,29987,2009-05-03 00:13:23 AM,user1,group1
server4,/var/tmp/xxz.zip,file,400,2007-12-03 03:52:43 PM,root,root
server1-adm.test.com,/usr,dir,34299876,2006-12-03 04:52:43 PM,root,root
server3-prd.mod.com,/local/home,dir,400,2009-05-03 12:13:23 PM,user2,group1

行的东西date -d "2007-12-03 15:52:43" +%Y/%m/%d:%H%M%S。我不知道我们怎样才能让 AM/PMdate指挥。

我已经有多个 awk 语句作为脚本的一部分一起运行,以对同一个传​​入文件执行其他文本修改,因此我想使用 awk + ​​date 语句来执行此操作。

标签: shelldateawk

解决方案


如果您可以使用 GNU awk,它会提供一些时间函数,使您的程序运行起来比date为 CSV 文件的每一行调用 shell + 更快:

awk 'BEGIN { FS = OFS = "," } { gsub("[-:]", " ", $5); $5 = strftime("%F %r", mktime($5)) } 1'

扩展形式:

awk '
    BEGIN { FS = OFS = "," }

    {
        gsub("[-:]", " ", $5)
        $5 = strftime("%F %r", mktime($5))
    }

    1
'

如果您真的想使用外部date命令,正如您在问题中所述,请使用 GNUawk协同进程,以便date在每一行仅启动和重用一个命令:

awk 'BEGIN { FS = OFS = ","; cmd = "stdbuf -oL date -f - +%F\" \"%r" } { print $5 |& cmd; cmd |& getline $5 } 1'

扩展形式:

awk '
    BEGIN {
        FS = OFS = ","
        cmd = "stdbuf -oL date -f - +%F\" \"%r"
    }

    {
        print $5 |& cmd
        cmd |& getline $5
    }

    1
'

但是你真的应该采用第一个解决方案。


推荐阅读