用于提取警告和事件的tcl脚本

时间:2013-12-11 22:01:50

标签: regex tcl

我正在尝试编写打开文件的tcl脚本,并找出其中的错误/警告和出现。

例如,在文件中,我有类似的内容:

Severity: Warning    Occurrence: 2

Severity: Error    Occurrence: 2

我想提取这些信息

      set fp [ open xx/a.rpt "r" ]
       set Error  "--"
        set Warning "--"
            while { [ gets $fp line ] >= 0 } {
               if { [ regexp "^# Error" $line ] } {
                  regsub -all {(\s+)} $line { } temp_err
                  set Error  [ lindex [ split $temp_err " " ] 2 ]
                  puts $Error
               } elseif { 
                  [ regexp "^# Warning" $line ] 
               } 
               {
                  regsub -all {(\s+)} $line { } temp_warn
                  set Warning [ lindex [ split $temp_warn " " ] 2 ]
                  puts $Warning             
               }

            };
        close $fp

2 个答案:

答案 0 :(得分:0)

用于匹配警告:

 ^Severity:\s+Warning\s+Occurrence:\s+\d+

对于匹配错误:

 ^Severity:\s+Error\s+Occurrence:\s+\d+

答案 1 :(得分:0)

您似乎从问题中留下了一些细节。 (不好主意;你这样得到的答案都不完整。)从下面你有regsub构造的事实来看,我猜你输入中有一个你想要存储的错误名称。你对Alex的评论说你想要捕获事件的数量。

有一部分正则表达式在使用括号()进行比较时提取信息。根据您在评论中提供的剪辑,构建您的正则表达式:

if { [regexp {^([^:\s]):.+Severity:\s+Error\s+Occurrence:\s+(\d+)} $line match errName count] } {
    puts $errName
    incr errCount $count
}

围绕[^:\ s] +的第一组括号应该在第一个冒号前收集非空白块,并将其放在变量“errName”中。围绕\ d +的第二组应该收集结束该行的数字并将它们放入变量“count”。

使用括号收集子字段的原则非常强大,并且比您正在执行的regsub / split / lindex处理更有效。