1

ルーターから重要な情報を取得するために、Expect / TCL スクリプトを実行しています。

私の目的の 1 つは、参照としてルーターにログインした IP を使用して、ルーターの WAN インターフェイスの名前を取得することです。

ルーター IP の例: 66.66.66.66 - これは、変数 $rtrname に含まれています。

Expectを使用して、以下のデータ($expect_out(buffer))を次の式で評価し、値$wanに出力します...

表現:

regexp (.*?)(?=(?:\..*?)?\s{2,}$rtrname) $expect_out(buffer) wan

$expect_out(バッファ):

Router1#sh ip int brief
Interface                  IP-Address      OK? Method Status                Protocol
Embedded-Service-Engine0/0 unassigned      YES NVRAM  administratively down down    
GigabitEthernet0/0         unassigned      YES NVRAM  up                    up      
GigabitEthernet0/0.10      55.55.55.55  YES NVRAM  up                    up      
GigabitEthernet0/0.20      66.66.66.66  YES NVRAM  up                    up      
GigabitEthernet0/1         77.77.77.77   YES NVRAM  up                    up      
GigabitEthernet0/2         192.168.1.1   YES NVRAM  up                    up   

$rtrname == 66.66.66.66 の場合、これは $wan を GigabitEthernet0/0 として正しく返します。これは私が望むものです。

残念ながら、次のような出力では正しく動作しません。

Router2#sh ip int brief
Interface               IP Address          Status      Protocol
eth 0/1                192.168.1.1            UP          UP         
eth 0/2                77.77.77.77       UP          UP         
fr 1.501               55.55.55.55       UP          UP         
fr 1.502               66.66.66.66       UP          UP     

これにより、'fr 1' を期待しているときに $wan が何も返されません。

私はいくつかの異なる正規表現ツールを使用しましたが、式は成功したようです。ドロップしないのは、コードにドロップしたときだけです。私は何が欠けていますか?

PS - 私はネットワーク エンジニアであり、本業のプロのコーダーではありません。:)

4

1 に答える 1

1

あなたは本当に得ていますGigabitEthernet0/0か?正規表現が間違っているため、次のようにする必要があります。

regexp -line -- ^(.*?)(?=(?:\\..*?)?\\s{2,}$rtrname) $expect_out(buffer) wan
                            ^       ^

-lineフラグは、文字列全体ではなく行頭に一致させることです^

式を中かっこで囲んでいないため、バックスラッシュを二重にエスケープする必要があります。

そして、正規表現は他の出力でも機能します。

于 2013-09-19T19:54:20.923 に答える