2012-12-14 2 views
1

Bonjour Je travaille sur un petit script qui me permettra d'analyser les informations d'une entrée. Cela fonctionne, mais je sais qu'il y a une meilleure façon d'avoir fait cela. S'il vous plaît, j'essaie d'apprendre [autodidacte] alors arrache-moi. L'entrée serait la suivante:Nettoyer la liste TCL & sortie

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  

la sortie désirée serait la suivante:

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

Le code que j'ai est la suivante:

#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 "$C1MacAddress\t$C1IpAddress\n$C2MacAddress\t$C2IpAddress\n$C3MacAddress\t$C3IpAddress\n$C4MacAddress\t$C4IpAddress" 
+0

Quelle est la question awk aidera ici, TCL semble comme un overkill – Drakosha

+0

Vraiment, c'est juste pour aller mieux, je savais qu'il y avait un 'foreach' qui aurait pu le faire dans beaucoup moins de lignes que moi, je peux habituellement travailler sur comment faire quelque chose ... Je travaille maintenant sur rationaliser mon code pour qu'il fonctionne efficacement – CK1

+0

** La raison pour laquelle ceci est fait dans TCL est que j'utilise un programme qui l'exécute.J'utilise PcShorthand 10 pour automatiser beaucoup de travail répétitif.Le programme est vraiment génial pour ceux qui Tapez beaucoup. ** – CK1

Répondre

0

Eh bien, en supposant que nous le charger à partir d'un fichier txt, ce serait comment Je le ferais:

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 

Je pensais juste que ce pourrait être de fantaisie si vous pourriez dire quel client est ce qui ^^. Vous pouvez supprimer la partie 'Customer $ count' et toutes les lignes impliquant '$ count' si vous n'avez pas besoin de cette fonctionnalité supplémentaire.

Ou si les données d'entrée est sous forme de tableau (ce qui signifie les informations dont vous avez besoin sont dans les mêmes colonnes, je vais pour:

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 
+0

Merci à tous ceux qui ont répondu. Comme indiqué, je suis en train d'apprendre TCL et de savoir comment améliorer mon travail. – CK1

2

voici ma solution:

# 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 "$x\t$y" 
    } 
} 

le regexp je recherche pour le modèle de six 2-CHARS mots séparés par des virgules, puis un espace suivi d'un mot suivi d'un sp As (\ s + \ S + \ s +) puis le modèle de l'adresse IP . L'expression regexp renvoie une liste de trios (ce qui est plat, pas une liste de listes) où chaque trio est composé de la correspondance entière, puis de la première parnthèse, puis de la première. D'où le var. Alternativement, vous pouvez faire avec une expression rationnelle, puisque chaque ligne a le même nombre de mots. Etant donné que dans Tcl, vous pouvez traiter une chaîne comme alist, dont les éléments sont sparated par des espaces, vous pouvez extraire vos données plus simplement par:

foreach line $lines { 
    set x [lindex $line 6] 
    set y [lindex $line 8] 
    puts "$x\t$y" 
} 
Questions connexes