ディスプレイ在庫からシリアル番号を入手する[閉じる]

ディスプレイ在庫からシリアル番号を入手する[閉じる]

コマンドからciscoデバイスの合計を取得したいとし、次device IDのファイルにターミナル出力があります。Serial Numbershow inventory

show inventory
NAME: "1", DESCR: "WS-C3750G-12S"
PID: WS-C3750G-12S-E   , VID: V06, SN: FDO1129Z9ZJ

NAME: "GigabitEthernet1/0/1", DESCR: "1000BaseLX SFP"
PID:                     , VID:    , SN: H006K022        

NAME: "GigabitEthernet1/0/2", DESCR: "10/100/1000BaseTX SFP"
PID: GLC-T               , VID:    , SN: 00000MTC1444080Z

NAME: "GigabitEthernet1/0/3", DESCR: "1000BaseLX SFP"
PID:                     , VID:    , SN: H006K083        

NAME: "GigabitEthernet1/0/4", DESCR: "1000BaseLX SFP"
PID:                     , VID:    , SN: H006K021        

NAME: "GigabitEthernet1/0/5", DESCR: "1000BaseSX SFP"
PID:                     , VID:    , SN: FNS11190FLE     

NAME: "GigabitEthernet1/0/6", DESCR: "1000BaseSX SFP"
PID:                     , VID:    , SN: P7K08UQ         

NAME: "GigabitEthernet1/0/7", DESCR: "1000BaseLX SFP"
PID:                     , VID:    , SN: H006K032        

NAME: "GigabitEthernet1/0/8", DESCR: "1000BaseLX SFP"
PID:                     , VID:    , SN: H006K040        

NAME: "GigabitEthernet1/0/9", DESCR: "1000BaseLX SFP"
PID:                     , VID:    , SN: FNS14420533     

NAME: "GigabitEthernet1/0/10", DESCR: "1000BaseLX SFP"
PID: GLC-LH-SMD          , VID: V86, SN: FNS16361SG0     

NAME: "GigabitEthernet1/0/11", DESCR: "1000BaseLX SFP"
PID: GLC-LH-SMD          , VID: V86, SN: FNS174002FT     

NAME: "GigabitEthernet1/0/12", DESCR: "1000BaseLX SFP"
PID: GLC-LH-SMD          , VID: V86, SN: FNS183503FS     


Barragan_3750>

SN次のように、「1」というデバイスとdevice name「>」の後にデバイスをインポートしたいと思います。

Barragan_3750
SN: FDO1129Z9ZJ

よろしくお願いします。

答え1

GNUの使用sed:

$ show inventory | sed -n '/^NAME: "1"/,+1s/^.*, //p'
DESCR: "WS-C3750G-12S"
SN: FDO1129Z9ZJ

編集スクリプトは、その行で始まるsed行を見つけてNAME "1"置換を適用し、すぐに次の最初の行を適用します。

置換は、最後のカンマ(および次のスペース)までの行のすべての内容を削除します。結果の文字列が端末に印刷されます。

シーケンス番号と出力の最後の行だけが必要な場合:

$ show inventory | sed -n -e '/^NAME: "1"/{n;s/^.*, //p}' -e '$p'
SN: FDO1129Z9ZJ
Barragan_3750>

ここでsedスクリプトは以前と同じ行を見つけましたが、すぐに次の行を読み(使用n)、その行で以前と同じ置換を実行します。これによりシリアル番号が提供されます。

次に、入力した最後の行も印刷します。

答え2

レコード区切り記号として空白行を使用します。

行が「1」と一致する場合は、「最後のフィールドを保存します。

最後の文字なしで最後の行を印刷し、保存されたフィールドを印刷します。

awk 'BEGIN {RS = ""}
     { if ($0 ~/ "1", /) { serial=$NF } }
     END { print substr($0, 1, length($0)-1) ; print "SN: " serial }' file

答え3

show inventory | perl -l -00ane '
  /^NAME:\s+"1",/m and $serial_num = "@F[-2,-1]";
  print substr($_,0,-1), $\, $serial_num if eof;
'

上記を簡単にまとめると、次のようになります。

上記の目標を達成するためにPerlいくつかのオプションを使用します。私たちはparagraph mode -00PerlをANDと自動分割モードで動作し、新しい段落を読むたびに-a各段落を空白に分割して配列を埋めます。@F

Perl's $_彫刻を飲み込んだ後の様子は次のとおりです。

名前:「1」、説明:「WS-C3750G-12S」

PID:WS-C3750G-12S-E、VID:V06、SN:FDO1129Z9ZJ

ああ、$_ちょっと待ってください。次に、次のように $_分割します。これにより、反対方向で説明した配列が作成されます。 \s+@F = split /\s+/, $_;@F$F[-1] = 'FDO1129Z9ZJ'; $F[-2] = 'SN:' ...

And mind you , all of the above happens under the hood。この問題が解決したら、次のPerlフラグメントのコードを見ることができます。 ",/m => は/^NAME:\s+"パターン修飾子が示すように a が a で始まるか a で始まるときに true を返します。 これを行うには、シリアル番号を最後の番号として取得します。有名なシェル変数のように二重引用符で囲むことができます。これは、スペースで区切られた配列要素のリストを取得することを意味します。します。record aka para aka $_NAME...NAME...newline/mfor multiple-line matching$F[-1]SN:$F[-2]@F[-2,-1]"@F[-2,-1]""$F[-2]" space "$F[-1]""$@"$" superglobalIFS"$*"bash

もう装備を整えたので探したいアカをserial number探しに行きましょう。ここでは aka を取り出し、文字が示す内容を最後から削除し、削除後に戻り、オプションにより塗りつぶされた文字と決定された文字を連結します。これは最終的に標準出力として印刷されます。device numberlast recordeofsubstr($_,0,-1)$_para1-1-serial_number$\\n-l

あまりにも混乱しないことを願って&HTH。

関連情報