Networking TCL:如何根据日期戳将日志消息分组到一起

Networking TCL:如何根据日期戳将日志消息分组到一起,networking,logging,tcl,cisco-ios,Networking,Logging,Tcl,Cisco Ios,我是TCL的新手,需要一些帮助,根据Cisco路由器的日期戳将日志消息分组在一起 更新:样本日志中的更改。我们发现当DD是一个数字时,会有一个额外的空格。e、 g“1” Samplelog:显示日志记录 THREADID: Feb 1 HH:MM:SS.SSS : %TYPE-OF-VAIRBLE: DOWN THREADID: Feb 1 HH:MM:SS.SSS : %TYPE-OF-VAIRBLE: DOWN THREADID: Feb 1 HH:MM:SS.SSS : %TYPE

我是TCL的新手,需要一些帮助,根据Cisco路由器的日期戳将日志消息分组在一起

更新:样本日志中的更改。我们发现当DD是一个数字时,会有一个额外的空格。e、 g“1”

Samplelog:显示日志记录

THREADID: Feb  1 HH:MM:SS.SSS : %TYPE-OF-VAIRBLE: DOWN
THREADID: Feb  1 HH:MM:SS.SSS : %TYPE-OF-VAIRBLE: DOWN
THREADID: Feb  1 HH:MM:SS.SSS  : %TYPE-OF-VAIRBLE: OFFLINE
THREADID: Feb  1 HH:MM:SS.SSS : %TYPE-OF-VAIRBLE: DOWN
THREADID: Feb  3 HH:MM:SS.SSS : %TYPE-OF-VAIRBLE: UP
THREADID: Feb  3 HH:MM:SS.SSS : %TYPE-OF-VAIRBLE: UP
THREADID: Feb  4 HH:MM:SS.SSS : %TYPE-OF-VAIRBLE: DOWN
THREADID: Feb  4 HH:MM:SS.SSS : %TYPE-OF-VAIRBLE: DOWN
THREADID: Mar 15 HH:MM:SS.SSS : %TYPE-OF-VAIRBLE: UP
THREADID: Mar 15 HH:MM:SS.SSS : %TYPE-OF-VAIRBLE: DOWN
THREADID: Mar 15 HH:MM:SS.SSS : %TYPE-OF-VAIRBLE: DOWN
THREADID: Mar 16 HH:MM:SS.SSS : %TYPE-OF-VAIRBLE: UP
THREADID: Mar 16 HH:MM:SS.SSS : %TYPE-OF-VAIRBLE: DOWN
THREADID: Mar 16 HH:MM:SS.SSS : %TYPE-OF-VAIRBLE: DOWN
期望输出

Feb 01 || 3 down
Feb 04 || 2 down
Mar 15 || 2 down
Mar 16 || 2 down
使用新代码和新逻辑进行更新,以尝试解决额外的空间问题,尽管这并没有按预期工作

set y [read -nonewline [set f [open "tmp.txt" r]]];

array set counts [list];
foreach message [split $y "\n"] {
    # This gets the status, ie: DOWN/UP/OFFLINE.
    set status [lindex [split $message] end]; # will assign last field
    set mon [lindex [split $message] 1]; # number represents the filed number
    set day [lindex [split $message] 2];
    if {$day ==""} {
        set day [lindex [split $message] 3];
     } else {
        set day [lindex [split $message] 2]
    }
        # +number represents the counter
    if {[info exists counts($mon,$day,$status)]} {
            set counts($mon,$day,$status) [expr {$counts($mon,$day,$status)+1}] 
    } else {
            set counts($mon,$day,$status) 1
    }   
}

# sort based for down type events

puts "\n\n MMM DD || Cnt Status"
puts " ====================="

foreach count [lsort -increasing -unique [array names counts]] {

    foreach {mon day status} [split $count ","] { break; }
    if {$status =="down"} {
    puts " $mon $day || [set counts($count)] \t $status"
    }
}

if {[info exists f]} { close $f }

只需使用关联数组-(原文如此!)或(出现在Tcl 8.5中)

在扫描之前,您的数组是空的,当您扫描日志文件并解析其中的文本行时(取决于实际的文件格式,这可以使用或等完成),检查数组中是否已经存在与您的分组条件匹配的条目。如果没有,则向数组中插入一些数据结构,由一些初始值填充。如果存在匹配条目,则使用新数据更新与其关联的数据结构

至于实际的数据结构。。。对于
array
s,我将使用两个元素,它们的元素分别包含“up”和“down”事件的数量
dict
可以嵌套保守派,因此您可以使用这种可能性


请注意,我不清楚日志文件的真正含义,因此可能关联数组的元素应该保留一些其他值,但总体思路仍然是:这是关联数组的任务。

试试这个-您需要将“file.txt”更改为日志文件

set y [read -nonewline [set f [open "file.txt" r]]];

array set counts [list];
foreach message [split $y "\n"] {
        # This gets the status, ie: DOWN/UP/OFFLINE.
        set status [lindex [split $message] end];
        set id [lindex [split $message] 3];
        if {[info exists counts($id,$status)]} {
                set counts($id,$status) [expr {$counts($id,$status)+1}]
        } else {
                set counts($id,$status) 1
        }
}

foreach count [lsort -increasing -unique [array names counts]] {
        foreach {name status} [split $count ","] { break; }
        puts "MMM $name || [set counts($count)] $status"
}

if {[info exists f]} { close $f }
此项的输出(针对您给出的示例日志)给出:


这个分组不是基于日期戳的。嗨,谢谢你的例子,虽然它没有给我想要的输出。它显示MMM而不是月份。你能不能也给你的代码提供更多的注释,这样我就可以理解它是如何工作的,并根据需要进行调整。如果我想只输出超过一定数量的日志消息,我该怎么做?e、 g只计算3以上。输出:MMM 01 | | 3 down在您的第二位中,foreach count[lsort…],如果{[set counts($count)]<3}{continue;}谢谢,还有一个问题,我认为它已经完成了。我发现日志上没有写“01”,实际上是这样的,当一天是一位数时,“1”会增加一个额外的空格。我已经更新了我的问题和代码。有没有更好的方法来处理多余的空间?您可以使用[string trim$day]在开始时删除多余的空格:)谢谢您的回答,这很有意义,但有很多信息需要处理和理解。
MMM 01 || 3 DOWN
MMM 01 || 1 OFFLINE
MMM 03 || 2 UP
MMM 04 || 2 DOWN