您好,我正在开发一个小脚本,该脚本将允许我解析输入中的信息。这是有效的,但我知道有更好的方法来做到这一点。拜托,我正在努力学习[自学成才],所以撕裂我。输入如下:
C7-0-4-U1 36.5 mHz IN7-0-4-0 567 mHz 00:15:d0:e3:b0:41 online(pt) 10.106.156.129 42.0 -0.5 35.1 -3.0 38.7 0.0E+000 0.0E+000 9 0 12:20:32 AM rZ5 1
C7-0-4-U1 36.5 mHz IN7-0-4-0 567 mHz 2c:9e:5f:de:ed:36 w-online(pt) 10.113.52.11 36.5 0.0 35.1 -5.0 37.7 4.9E-006 0.0E+000 9 0 12:20:32 AM r4G 0
C7-0-4-U1 36.5 mHz IN7-0-4-0 567 mHz e4:83:99:6d:57:ad w-online(pt) 10.113.45.239 43.5 0.0 35.1 -4.6 39.5 5.8E-006 0.0E+000 8 0 12:20:34 AM r4G 0
C7-0-4-U1 36.5 mHz IN7-0-4-0 567 mHz 3c:75:4a:9c:7b:92 w-online(pt) 10.109.238.61 42.2 -0.5 33.9 -14.4 34.6 4.9E-006 0.0E+000 199 4 12:20:33 AM rC2 0
所需输出如下所示:
00:15:D0:E3:B0:41 10.106.156.129
2C:9E:5F:DE:ED:36 10.113.52.11
E4:83:99:6D:57:AD 10.113.45.239
3C:75:4A:9C:7B:92 10.109.238.61
我拥有的代码如下:
#GET INPUT FROM CLIPBOARD
set Input [sh_set clipboard]
#REMOVE ALL EXCESSIVE WHITESPACE
regsub -all {s{3,}} $Input "n" CleanInput
#SET THE INPUT AS LIST
set List [split $CleanInput "n"]
#GET LIST ITEMS
set Cust1 [lindex $List 1]
set Cust2 [lindex $List 2]
set Cust3 [lindex $List 3]
set Cust4 [lindex $List 4]
regexp -all {(?:[[:xdigit:]]{2}([.-:]))(?:[[:xdigit:]]{2}1){4}[[:xdigit:]]{2}} $Cust1 C1MacAddress
regexp -all {10.(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?).){2}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)} $Cust1 C1IpAddress
regexp -all {(?:[[:xdigit:]]{2}([.-:]))(?:[[:xdigit:]]{2}1){4}[[:xdigit:]]{2}} $Cust2 C2MacAddress
regexp -all {10.(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?).){2}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)} $Cust2 C2IpAddress
regexp -all {(?:[[:xdigit:]]{2}([.-:]))(?:[[:xdigit:]]{2}1){4}[[:xdigit:]]{2}} $Cust3 C3MacAddress
regexp -all {10.(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?).){2}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)} $Cust3 C3IpAddress
regexp -all {(?:[[:xdigit:]]{2}([.-:]))(?:[[:xdigit:]]{2}1){4}[[:xdigit:]]{2}} $Cust4 C4MacAddress
regexp -all {10.(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?).){2}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)} $Cust4 C4IpAddress
return "$C1MacAddresst$C1IpAddressn$C2MacAddresst$C2IpAddressn$C3MacAddresst$C3IpAddressn$C4MacAddresst$C4IpAddress"
的解决方案:
# read entire file
set fid [open file.txt r]
set txt [read $fid]
close $fid
# split into lines
set lines0 [split $txt n]
# take only non-empty lines
set lines {}
foreach line $lines0 {
if {[string trim $line] ne ""} {
lappend lines $line
}
}
# extract the required data from each line
foreach line $lines {
set data [regexp -inline {(w{2}:w{2}:w{2}:w{2}:w{2}:w{2})s+S+s+ (d+.d+.d+.d+)} $line]
foreach {dummy x y} $data {
puts "$xt$y"
}
}
我使用的正则表达式搜索六个用冒号分隔的 2 个字符单词的模式,然后是一个空格,后跟一个单词,后跟一个空格 (\s+\S+\s+),然后是 ip 的模式地址。
正则表达式返回一个三重奏列表(这是平面的,而不是列表列表),其中每个三重奏由整个匹配项组成,然后是第一个 parnthesis 匹配项,然后是 scond 匹配项。因此,假变量。
或者,您可以不使用正则表达式,因为每行都有相同数量的单词。由于在 tcl 中,您可以将字符串视为 alist,其项目被空格隔开,因此您可以通过以下方式更简单地提取数据:
foreach line $lines {
set x [lindex $line 6]
set y [lindex $line 8]
puts "$xt$y"
}
好吧,假设我们从 txt 文件加载它,这就是我的做法:
set input [open "file.txt" r]
set output [open "output.txt" w]
set count 1
while {[gets $input line] != -1} {
if {$line == ""} {continue} #Skip empty lines
regexp -all {(w{2}:w{2}:w{2}:w{2}:w{2}:w{2})} $line - MacAddress #trap the mac address and store into $MacAddress
regexp -all {(d+.d+.d+.d+)} $line - IpAddress #trap the IP address and store into $IpAddress
puts $output "Customer $count: $MacAddress $IpAddress"
incr count
}
close $input
close $output
我只是觉得,如果你能说出哪个客户是哪个^^,那可能会很花哨。如果您不需要该额外功能,您可以删除"客户$count"部分和任何涉及"$count"的行。
或者,如果输入数据是表格形式(意味着您需要的信息在同一列中,我会选择:
set input [open "file.txt" r]
set output [open "output.txt" w]
set count 1
while {[gets $input line] != -1} {
if {$line == ""} {continue} #Skip empty lines
regsub -all { +} $line " " newline #trims excess spaces
set MacAddress [lindex [split $line " "] 6]
set MIpAddress [lindex [split $line " "] 8]
puts $output "Customer $count: $MacAddress $IpAddress"
incr count
}
close $input
close $output