TCL如何读取、提取和统计.txt文件(当前目录)中的事件

TCL如何读取、提取和统计.txt文件(当前目录)中的事件,tcl,Tcl,我是一名脚本编写初学者,并积极学习TCL以开发嵌入式系统 我必须搜索当前目录中仅为.txt格式的文件,计算.txt文件中每个不同“Interface#nnnn”字符串的案例数,其中nnnn是一个4到32位的最大十六进制数,并且针对出现的情况计算接口号表的o/p。我在编写脚本时面临实现问题,即无法实现链表、二维数组等数据结构。 我正在使用TCL中的多维数组(将值传入数组和传出过程)重写一个脚本,以扫描every.txt文件并搜索字符串/正则表达式“Interface#”,以计数和显示出现的次数。如

我是一名脚本编写初学者,并积极学习TCL以开发嵌入式系统

我必须搜索当前目录中仅为.txt格式的文件,计算.txt文件中每个不同“Interface#nnnn”字符串的案例数,其中nnnn是一个4到32位的最大十六进制数,并且针对出现的情况计算接口号表的o/p。我在编写脚本时面临实现问题,即无法实现链表、二维数组等数据结构。 我正在使用TCL中的多维数组(将值传入数组和传出过程)重写一个脚本,以扫描every.txt文件并搜索字符串/正则表达式“Interface#”,以计数和显示出现的次数。如果有人能帮助我完成这一部分将不胜感激

仅搜索.txt扩展名文件并获取文件大小 下面是我在当前目录中搜索.txt文件的代码

set files [glob *.txt]
if { [llength $files] > 0 } {
    puts "Files:"
    foreach f [lsort $files] {
        puts "    [file size $f] - $f"
    }
} else {
    puts "(no files)"
}
我认为这些都是完成这项工作的逻辑步骤 i) 搜索并找到.txt文件后,以只读模式打开所有.txt文件 ii)创建一个数组或列表,使用过程(proc)接口号为NULL,接口计数为0 iii)通过.txt文件扫描并搜索字符串或正则表达式“interface#” iv)当在.txt文件中找到匹配项时,检查接口编号并增加相应条目的计数。否则,将新元素添加到接口编号列表中 v) 如果没有文件,则返回第一个目录

set files [glob *.txt]
if { [llength $files] > 0 } {
    puts "Files:"
    foreach f [lsort $files] {
        puts "    [file size $f] - $f"
    }
} else {
    puts "(no files)"
}
我的订单如下

Interface    Frequency
123f            3
1232            4
编辑为按名称使用数组而不是全局变量

我想你会想要类似的东西。你可以在每个文件上调用
scan\u for\u interface
,最后调用
print\u report
。你可以让fancier将其包装在一个类或一个中。
scan\u for\u interface
的第二个参数是存储结果的数组的名称,该名称是pa转到
print\u report
。该链接将描述
regexp
的工作原理:

proc scan_for_interface {file arrayname} {
  upvar $arrayname array
  set fh [open $file r]
  while {[gets $fh line] >= 0} {
    if {[regexp -- {Interface # ([[:xdigit:]]{4}|[[:xdigit:]]{32})$} $line ignore num]} {
      if {[info exists array($num)]} {
        incr array($num)
      } else {
        set array($num) 1
      }
    }
  }
  close $fh
}

proc print_report {arrayname} {
  upvar $arrayname array
  puts "Interface    Frequency"
  set fmt "%s             %d"
  foreach {interface number} [array get array] {
    puts [format $fmt $interface $number]
  }
}

# the following is a proc that takes the question's code
# and incorporates the calls to the accounting functions
proc dosearch {} {
  set files [glob *.txt]
  if { [llength $files] > 0 } {
    puts "Files:"
    foreach f [lsort $files] {
      puts "    [file size $f] - $f"
      scan_for_interface $f tally
    }
    print_report tally
  } else {
    puts "(no files)"
  }
}
编辑为按名称使用数组而不是全局变量

我想你会想要类似的东西。你可以在每个文件上调用
scan\u for\u interface
,最后调用
print\u report
。你可以让fancier将其包装在一个类或一个中。
scan\u for\u interface
的第二个参数是存储结果的数组的名称,该名称是pa转到
print\u report
。该链接将描述
regexp
的工作原理:

proc scan_for_interface {file arrayname} {
  upvar $arrayname array
  set fh [open $file r]
  while {[gets $fh line] >= 0} {
    if {[regexp -- {Interface # ([[:xdigit:]]{4}|[[:xdigit:]]{32})$} $line ignore num]} {
      if {[info exists array($num)]} {
        incr array($num)
      } else {
        set array($num) 1
      }
    }
  }
  close $fh
}

proc print_report {arrayname} {
  upvar $arrayname array
  puts "Interface    Frequency"
  set fmt "%s             %d"
  foreach {interface number} [array get array] {
    puts [format $fmt $interface $number]
  }
}

# the following is a proc that takes the question's code
# and incorporates the calls to the accounting functions
proc dosearch {} {
  set files [glob *.txt]
  if { [llength $files] > 0 } {
    puts "Files:"
    foreach f [lsort $files] {
      puts "    [file size $f] - $f"
      scan_for_interface $f tally
    }
    print_report tally
  } else {
    puts "(no files)"
  }
}

我不是globals的忠实粉丝,我会选择Trey使用的东西,但让它返回当前文件的dict(或数组get)结果,并将它们合并到一个在调用方级别维护的dict(或数组)中。

我不是globals的忠实粉丝,我会选择Trey使用的东西,但让它返回dict(或数组get),并将它们合并到一个在调用方级别维护的dict(或数组)中。

我会在
print_report
中省略总和,这似乎是原始问题中的一个输入错误。否则,这是一个很好的答案。(就我个人而言,我会使用
global-global_-array
inside
scan_for_-interface
,但这是一件小事。)正则表达式可以是
{interface}([[[:xdigit:]{4}[:xdigit:]{32}}}}
@Trey Jackson非常感谢much@Passion我编写了一个
dosearch
proc,其中包含了调用的初始代码。我没有看到任何语法错误,事实上成功地运行了上述代码。如果您仍然有问题,您需要提供更多详细信息。@Trey Jackson谢谢您。显然,我不得不承认这是我的错误。我在当前目录中创建了耦合*.txt文件。但是正则表达式没有提取/读取(接口和频率)和显示十六进制值(4位或32位)在命令行中。我会在
print_report
中省略求和,这似乎是原始问题中的一个输入错误。否则,这是一个非常好的答案。(我个人会在
scan_for_interface
中使用
global-global_-array
,但这是一件小事。)正则表达式可以是
{interface#([[:xdigit:]{4}|[[:xdigit:][{32})$}
@Trey Jackson非常感谢much@Passion我编写了一个
dosearch
proc,其中包含了调用的初始代码。我没有看到任何语法错误,事实上成功地运行了上述代码。如果您仍然有问题,您需要提供更多详细信息。@Trey Jackson谢谢您。显然,我不得不承认这是我的错误。我在当前目录中创建了耦合*.txt文件。但是正则表达式没有提取/读取(接口和频率)和显示十六进制值(4位或32位)在命令行中。是否有人指导我完成上面原始问题中的“输入错误”。一旦我打开/扫描了接口,我会想计算每个接口频率的实例数(重复和驻留在.txt文件中的次数。谢谢有人能指导我完成上面原始问题中的“打字错误”吗?一旦我打开/扫描接口,我想计算每个接口频率的实例数(重复和驻留在.txt文件中的次数。谢谢