比较日志文件中的2个日期

时间:2012-11-15 07:39:26

标签: bash sed awk

我有以下长文件

2012-01-30 12:41:06,214 app10 device INFO [2012-01-30 12:40:46,214] info1 info2 info3 ...

这来自远程离线设备,这意味着如果设备的时间(第二次)设置不正确,则指向未来。如果第二次指向未来,我想将其更改为第一次约会。如果这是相同或过去,我想保持原样。只有日期很重要,根本不需要时间。在第二次之后,我们有几个数据,有时我们希望保留不同数量的列。

示例:

2012-01-30 12:41:06,214 app10 device INFO [2013-01-30 12:40:46,214] info1 info2 info3 ...

应该是

2012-01-30 app10 device INFO 2012-01-30 info1 info2 info3 ...

我们想从脚本运行它,所以我更喜欢bash,sed,awk或perl解决方案。 谢谢你的帮助

3 个答案:

答案 0 :(得分:2)

awk -F '[[:space:][]+' '
    $6 > $1 {$6 = $1} 
    {
        for (i=7; i<NF; i++) {$i = $(i+1)}; NF--   # delete time field 7
        for (i=2; i<NF; i++) {$i = $(i+1)}; NF--   # delete time field 2
        print
    } 
' <<< "2012-01-30 12:41:06,214 app10 device INFO [2222-33-44 12:40:46,214] info1 info2 info3 ..."

输出

2012-01-30 app10 device INFO 2012-01-30 info1 info2 info3 ...

答案 1 :(得分:0)

这可能对你有用,但它会在第二个日期/时间之前增加一个额外的空间,我会把它留给你找出如何删除它:

awk 'BEGIN { FS="[ \\[]" } 
{ if ( gensub("-","","g",$1) < gensub("-","","g",$7) ) { $7 = $1 }
  $7 = "[" $7
  print
}' INPUTFILE

你可以see it in action here @ Ideone.com

答案 2 :(得分:0)

另一个gnu awk替代方案。如果第二个日期没有改变,这个原始行保持不变:

awk -F '[][ \t]+' '$6>$1 {$6=$1; $2=$7=""; gsub(OFS"+", OFS);} 1' file