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