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



我有以下长文件

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

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

例:

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解决方案。感谢您的帮助

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 ...
好吧,

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

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

你可以在这里看到它的实际效果@Ideone.com。

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

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

相关内容

  • 没有找到相关文章

最新更新