Ciscoの「show switch」出力から新しい行を削除し、前の行と結合します。

Ciscoの「show switch」出力から新しい行を削除し、前の行と結合します。

新しい行を削除し、前の行と結合します

show switchこれは、Cisco ACI のコマンドの部分的なサンプル出力です。

Serial Number     Name               
----------------  ------------------ 
ABCDEFGHIJ1       XYZ_ 
                  SPN_01             
ABCDEFGHIJ2       XYZ_ 
                  SPN_02             
ABCDEFGHIJ3       XYZ_ 
                  SPN_03

私は、以下の解決策を試しました次の行を前の行と結合する

[user@linux ~]$ sed 'H;1h;$!d;g;s/\n  */ /g' sample.txt
Serial Number     Name
----------------  ------------------
ABCDEFGHIJ1       XYZ_  SPN_01
ABCDEFGHIJ2       XYZ_  SPN_02
ABCDEFGHIJ3       XYZ_  SPN_03
[user@linux ~]$

余分なスペースがあることを除けば、ほぼ希望どおりの出力が得られました。

望ましい出力1

Serial Number     Name
----------------  ------------------
ABCDEFGHIJ1       XYZ_SPN_01
ABCDEFGHIJ2       XYZ_SPN_02
ABCDEFGHIJ3       XYZ_SPN_03

show switch実際の問題は、より多くの列を持つ実際の出力で試したときに発生します。

[user@linux ~]$ cat output.txt
 ID    Pod   Address          In-Band IPv4     In-Band IPv6               OOB IPv4         OOB IPv6                   Version             Flags  Serial Number     Name
 ----  ----  ---------------  ---------------  -------------------------  ---------------  -------------------------  ------------------  -----  ----------------  ------------------
 101   1     192.168.1.10     0.0.0.0          ::                         10.1.1.10        ::                         n9000-13.0(2n)      asiv   ABCDEFGHIJ1       ABC_
                                                                                                                                                                   SPN_01
 102   1     192.168.1.11     0.0.0.0          ::                         10.1.1.11        ::                         n9000-13.0(2n)      asiv   ABCDEFGHIJ2       ABC_
                                                                                                                                                                   SPN_02
 103   1     192.168.1.12     0.0.0.0          ::                         10.1.1.12        ::                         n9000-13.0(2n)      asiv   ABCDEFGHIJ3       ABC_
                                                                                                                                                                   SPN_03
[user@linux ~]$

sed 'H;1h;$!d;g;s/\n */ /g' output.txt希望する出力が得られませんでした。

[user@linux ~]$ sed 'H;1h;$!d;g;s/\n  */ /g' output.txt
 ID    Pod   Address          In-Band IPv4     In-Band IPv6               OOB IPv4         OOB IPv6                   Version             Flags  Serial Number     Name                ----  ----  ---------------  ---------------  -------------------------  ---------------  -------------------------  ------------------  -----  ----------------  ------------------  101   1     192.168.1.10     0.0.0.0          ::                         10.1.1.10        ::                         n9000-13.0(2n)      asiv   ABCDEFGHIJ1       ABC_  SPN_01              102   1     192.168.1.11     0.0.0.0          ::                         10.1.1.11        ::                         n9000-13.0(2n)      asiv   ABCDEFGHIJ2       ABC_  SPN_02              103   1     192.168.1.12     0.0.0.0          ::                         10.1.1.12        ::                         n9000-13.0(2n)      asiv   ABCDEFGHIJ3       ABC_  SPN_03
[user@linux ~]$

awkほぼ動作しますが、フォーマットの何が問題なのかわかりません-----

[user@linux ~]$ awk '{$1=$1;printf("%s ",$0)};NR%2==0{print ""}' output.txt
ID Pod Address In-Band IPv4 In-Band IPv6 OOB IPv4 OOB IPv6 Version Flags Serial Number Name ---- ---- --------------- --------------- ------------------------- --------------- ------------------------- ------------------ ----- ---------------- ------------------
101 1 192.168.1.10 0.0.0.0 :: 10.1.1.10 :: n9000-13.0(2n) asiv ABCDEFGHIJ1 ABC_ SPN_01
102 1 192.168.1.11 0.0.0.0 :: 10.1.1.11 :: n9000-13.0(2n) asiv ABCDEFGHIJ2 ABC_ SPN_02
103 1 192.168.1.12 0.0.0.0 :: 10.1.1.12 :: n9000-13.0(2n) asiv ABCDEFGHIJ3 ABC_ SPN_03
[user@linux ~]$

別のawkスクリプトの試みも、前のsedスクリプトとほぼ同じ出力を生成します。

[user@linux ~]$ awk -f script.awk output.txt
 ID    Pod   Address     In-Band IPv4     In-Band IPv6               OOB IPv4         OOB IPv6                   Version             Flags  Serial Number     Name                ----  ----  ---------------  ---------------  -------------------------  ---------------  -------------------------  ------------------  -----  ----------------  ------------------  101   1192.168.1.10     0.0.0.0          ::                         10.1.1.10        ::                         n9000-13.0(2n)      asiv   ABCDEFGHIJ1       ABC_                                                                                                                                                               SPN_01              102   1192.168.1.11     0.0.0.0          ::                         10.1.1.11        ::                         n9000-13.0(2n)      asiv   ABCDEFGHIJ2       ABC_                                                                                                                                                               SPN_02              103   1192.168.1.12     0.0.0.0          ::                         10.1.1.12        ::                         n9000-13.0(2n)      asiv   ABCDEFGHIJ3       ABC_                                                                                                                                                               SPN_03
[user@linux ~]$

実際の望ましい出力 2

 ID    Pod   Address          In-Band IPv4     In-Band IPv6               OOB IPv4         OOB IPv6                   Version             Flags  Serial Number     Name               
 ----  ----  ---------------  ---------------  -------------------------  ---------------  -------------------------  ------------------  -----  ----------------  ------------------ 
 101   1     192.168.1.10     0.0.0.0          ::                         10.1.1.10        ::                         n9000-13.0(2n)      asiv   ABCDEFGHIJ1       ABC_SPN_01             
 102   1     192.168.1.11     0.0.0.0          ::                         10.1.1.11        ::                         n9000-13.0(2n)      asiv   ABCDEFGHIJ2       ABC_SPN_02             
 103   1     192.168.1.12     0.0.0.0          ::                         10.1.1.12        ::                         n9000-13.0(2n)      asiv   ABCDEFGHIJ3       ABC_SPN_03    

答え1

sed '1,2!{N;s/[[:blank:]]*\n[[:blank:]]*//;}' file

1~2の範囲外の各行:

  • パターンスペースに次の行を追加します
  • 先頭/末尾のスペースを削除する

答え2

これがあなたにとって有効かどうか教えてください:

sed 'H;1h;$!d;g;s/\n *  \([A-Z]*\)/\1/g' file

答え3

Raku (旧称 Perl_6) の使用:

raku -e '.put for lines[0...1]; .join("").put for lines.map(*.trim).rotor: 2;'

または

raku -e '.put for lines[0...1]; .put for lines.map(*.trim).rotor(2).map(*.join: "");'

サンプル入力(1):

Serial Number     Name               
----------------  ------------------ 
ABCDEFGHIJ1       XYZ_ 
                  SPN_01             
ABCDEFGHIJ2       XYZ_ 
                  SPN_02             
ABCDEFGHIJ3       XYZ_ 
                  SPN_03

サンプル出力(1):

Serial Number     Name               
----------------  ------------------ 
ABCDEFGHIJ1       XYZ_SPN_01
ABCDEFGHIJ2       XYZ_SPN_02
ABCDEFGHIJ3       XYZ_SPN_03

簡単に言うと、最初の 2 行 (ヘッダー行) は で印刷されますget.put xx 2;。次にlinesが (遅延的に) 読み込まれ、それぞれがtrim-med で周囲の空白を削除され、行のペアが でグループ化されますrotor: 2(注:rotor(2)行末でない場合は が必要です)。出力を取得するにはそれなしグループ化された行のペアの間にスペースを入れるには、join("")と print-using-terminator (別名 ) を使用しますput

OP が提供した 2 番目のサンプル ファイル (以下) でも機能します。

サンプル入力(2):

 ID    Pod   Address          In-Band IPv4     In-Band IPv6               OOB IPv4         OOB IPv6                   Version             Flags  Serial Number     Name
 ----  ----  ---------------  ---------------  -------------------------  ---------------  -------------------------  ------------------  -----  ----------------  ------------------
 101   1     192.168.1.10     0.0.0.0          ::                         10.1.1.10        ::                         n9000-13.0(2n)      asiv   ABCDEFGHIJ1       ABC_
                                                                                                                                                                   SPN_01
 102   1     192.168.1.11     0.0.0.0          ::                         10.1.1.11        ::                         n9000-13.0(2n)      asiv   ABCDEFGHIJ2       ABC_
                                                                                                                                                                   SPN_02
 103   1     192.168.1.12     0.0.0.0          ::                         10.1.1.12        ::                         n9000-13.0(2n)      asiv   ABCDEFGHIJ3       ABC_
                                                                                                                                                                   SPN_03

サンプル出力(2):

 ID    Pod   Address          In-Band IPv4     In-Band IPv6               OOB IPv4         OOB IPv6                   Version             Flags  Serial Number     Name
 ----  ----  ---------------  ---------------  -------------------------  ---------------  -------------------------  ------------------  -----  ----------------  ------------------
101   1     192.168.1.10     0.0.0.0          ::                         10.1.1.10        ::                         n9000-13.0(2n)      asiv   ABCDEFGHIJ1       ABC_SPN_01
102   1     192.168.1.11     0.0.0.0          ::                         10.1.1.11        ::                         n9000-13.0(2n)      asiv   ABCDEFGHIJ2       ABC_SPN_02
103   1     192.168.1.12     0.0.0.0          ::                         10.1.1.12        ::                         n9000-13.0(2n)      asiv   ABCDEFGHIJ3       ABC_SPN_03

注: 上記のコードを少し簡素化することができますが、2 つのjoin呼び出しが連続して表示されることに注意してください。1 つは-ped を使用して、隣接する行をスペースなしで結合し、もう 1 つはキャプチャされたデータ (ルーチンによって切り詰められたデータ) の間に改行mapを追加します。\nlines

raku -e 'raku -e '.put for lines[0...1]; lines.map(*.trim).rotor(2).map(*.join: "").join("\n").put;' 

関連情報