2014-03-12 75 views
0

日志文件中使用的系统日期命令数据转换看起来像:用awk变量

28 Feb 2014,12:43:10,SAST,1821996800,10.144.22.91,494225040,"CONNECT",STARTED,0,0,0,10.144.22.91:59172,->,1.1.1.6:80 
28 Feb 2014,12:43:10,SAST,1821996800,10.144.22.91,494225040,"CONNECT",TERMINATED,0,0,0,10.144.22.91:59172,->,1.1.1.6:80 

所需的输出:

2014/02/28,12:43:10,SAST,1821996800,10.144.22.91,494225040,"CONNECT",STARTED,0,0,0,10.144.22.91:59172,->,1.1.1.6:80 
2014/02/28,12:43:10,SAST,1821996800,10.144.22.91,494225040,"CONNECT",TERMINATED,0,0,0,10.144.22.91:59172,->,1.1.1.6:80 

Shell命令在执行该转换:

date -d "28 Feb 2014" +%Y/%m/%d 

问题: 如何使用awk做这种转换(稍后我需要做转换不同的时区之间的离子,这就是为什么date命令是用来操纵字符) 现在尝试了几种方案,但没有任何人,任何SED或其它方法是否正常工作:

版本1(出于某种原因,日期命令不运行使用全部AWK变量,并给我错误所以没有结果):

awk ' 
    BEGIN { FS = "," } 
    { 
    while ("date -d $1 +%Y/%m/%d" | getline ddd) print ddd; 
    } 
    ' _SOURCE_FILE 

版本2(根据需要,这不工作,但给我一个额外的行,并在其中添加一个“0”,也就是系统执行代码):

awk ' 
    BEGIN { FS = "," } 
    { 
    $1 = system("date -d \"$1\" +%Y/%m/%d") 
    print $0 
    } 
    ' _SOURCE_FILE 

帮助超过赞赏。

回答

0

awk不扩展字符串内的变量,使用串联。当命令只产生一行输出时,也不需要使用while

"date -d " $1 "+%Y/%m/%d" | getline ddd; 
$1 = ddd; 
print $0; 
+0

谢谢Barmar的快速回复。 我有一些麻烦,要了解如何使用您的示例,因为我收到错误。 日期:额外操作数'2014 +%Y /%m /%d' 尝试'date --help'以获取更多信息。 – user3409338