在awk中选择仅日期列

时间:2013-03-18 14:31:33

标签: awk gawk

我有这段代码:

{ 
    if ($4 ~search) 
    {
        match ($4, /([0-9]{2}\/([a-zA-z]{3})\/([0-9]{4}))/, dates)

        print dates[1] "\t" dates[2] "\t" dates[3]
    }
}

当它运行时产生这个:

[19/Oct/2012:12:34:32
[19/Oct/2012:12:34:32
[19/Oct/2012:12:34:33

所以从理论上说它正在起作用并产生我想要的一些东西,但是如何让它产生19/Oct/2012任何建议呢?

我的问题是,我希望输出只生成2012年10月19日的日期?

2 个答案:

答案 0 :(得分:1)

您需要修复正则表达式:

{
    match ($4,/[0-9]{2}\/[a-zA-z]{3}\/[0-9]{4}/,date)
    print date[0] 
}

将输出:

19/Oct/2012
19/Oct/2012    
19/Oct/2012

注意:

  • 您当前的regexp会查找数字月份为的日期 19/10/2012不是19/Oct/2012

  • 您的捕获组未匹配(不平衡括号)

  • 在您的示例中,年份为20012而非2012 !?

  • 您从dates转到date

  • date[0]存储整个匹配,而date[n]指的是第n个捕获组。

对于您的整体问题可能有更好的方法,但是不可能用非常少的(和非常错误的)信息来说明。

修改

似乎剩下的唯一问题是错位的捕获组。

{
    match ($4, /([0-9]{2})\/([a-zA-z]{3})\/([0-9]{4})/, dates)    
    print dates[1] "\t" dates[2] "\t" dates[3]
}

将输出:

19    Oct   2012
19    Oct   2012
19    Oct   2012

但是在你的问题中,你声明你希望输出的格式为19/Oct/2012 (这是我的第一个建议)

答案 1 :(得分:0)

忽略代码示例和输出中的错误,如果您只想删除前导[,那么您可以substr从第2个字符开始匹配:

print substr(date[0], 2)

但是,我建议您修改正则表达式以输出正确的匹配项。