2017-06-23 6 views
1

私はTCLを使ってciscoルータのすべてのインターフェイスを処理しようとしています。私のTCL式が重複した結果を返すのはなぜですか?

set int_out [exec "show interface description"] 

OUTPUT

Interface      Status   Protocol Description 
Fa0/0       up    up  ** REDACTED ** 
Fa0/0.209      up    up  ** REDACTED ** 
Fa0/0.790      up    up  ** REDACTED ** 
Fa0/1       admin down  down 

:現時点では私は、次の2つのコマンドを使用しています。ここ

foreach int [regexp -all -line -inline "^(\[^ ]+)" $int_out] { show clock; puts $int } 

OUTPUT

18:25:16.461 UTC Fri Jun 23 2017Interface 

18:25:16.465 UTC Fri Jun 23 2017Interface 

18:25:16.469 UTC Fri Jun 23 2017Fa0/0 

18:25:16.469 UTC Fri Jun 23 2017Fa0/0 

18:25:16.473 UTC Fri Jun 23 2017Fa0/0.209 

18:25:16.473 UTC Fri Jun 23 2017Fa0/0.209 

18:25:16.477 UTC Fri Jun 23 2017Fa0/0.790 

18:25:16.477 UTC Fri Jun 23 2017Fa0/0.790 

18:25:16.481 UTC Fri Jun 23 2017Fa0/1 

18:25:16.481 UTC Fri Jun 23 2017Fa0/1 

私の目標は、インタフェース記述が生成する表示し、出力の各行からインターフェイス名をつかむし、画面のそれをプリントアウトすることです。しかし、あなたが見ることができるように、私は画面上にデータを印刷するために行くと重複してしまいます。私は、これは最初に何らかの種類の画面ログ機能が原因である可能性があると考えましたが、出力に含まれているタイムスタンプはそうでないことを示しています。たとえば、最初のインターフェイス行のタイムスタンプは18:25:16.461でしたが、2番目のインターフェイス行のタイムスタンプは18:25:16.465でした。

この問題を解決するにはどうすればよいですか?私はそれが私の正規表現の文字列で、各行から最初の単語をつかむ問題かもしれないと思う。

答えて

2

問題は、regexp -inlineは、の各マッチの単語を返します。ここでは、簡単な例を見てみましょう:

puts [regexp -all -inline {.(.).} "abcdef"] 

これは、この出力を生成します

 
abc b def e 

あなたはあなたのように、一致する文字列のすべての空でない部分と一致したサブREを作ります^([^ ]+)で実行すると、一致した文字列全体が明らかに2回返されます。

可能な修正は、キャプチャカッコを使用しないようにREを変更することです(あなたの場合は、^[^ ]+で、Tclパーサを使用するにはバックスラッシュが必要です)。あなたが対処するように(無視?)foreachの多変数形式を使用しているすべての一致したサブ部品あなたが気にしない:

foreach {int inner} [regexp -all -line -inline "^(\[^ ]+)" $int_out] { 
    show clock 
    puts $int 
} 

(FWIW、あなたは通常{でのREを置くことを推奨しています括弧}は、バックスラッシュをたくさん追加することを避けるためです。それはあなたの問題ではありませんが、とにかく良いスタイルです。)

+0

ありがとう!そのトリックをした。 foreachの多変数形式でも良いアイデア – lacrosse1991

関連する問題