Text-Processing

匹配來自兩個不同文件的數據

  • February 23, 2017

為了記錄連接到網路的設備,我正在編寫一個Expect腳本,該腳本從命令中獲取資訊Show CDP neighbors detail並保存某些欄位,包括Device Name, IP address, Interface and Port ID (outgoing port),這些欄位中的任何一個都作為我的數據庫中的主鍵,甚至不是 IP 地址原因相同的 IP 地址並不能保證它是同一​​台設備。出於這個原因,我需要使用命令擷取每個設備的 S/N show inventory,我已經在單獨的文本文件中獲得了兩個命令的輸出,現在我需要匹配資訊。

文件1:

Device ID: BIOTERIO
 IP address: 000.000.00.001
Interface: GigabitEthernet1/0/6,  Port ID (outgoing port): GigabitEthernet0/1
Device ID: N7K-LAN(JAF1651ANDL)
 IP address: 000.000.0.002
Interface: GigabitEthernet1/0/1,  Port ID (outgoing port): Ethernet7/23
Device ID: LAB_PESADO
--More--           IP address: 000.000.000.003
Interface: GigabitEthernet1/0/11,  Port ID (outgoing port): GigabitEthernet0/1
 IP address: 000.000.000.003
Device ID: Arquitectura_Salones
 IP address: 000.000.000.04
Interface: GigabitEthernet1/0/9,  Port ID (outgoing port): GigabitEthernet0/49
 IP address: 000.000.000.04
Device ID: CIVIL_253
 IP address: 000.000.000.005
Interface: GigabitEthernet1/0/4,  Port ID (outgoing port): GigabitEthernet1/0/52
 IP address: 000.000.000.005
Device ID: Arquitectura
 IP address: 000.000.000.006
Interface: GigabitEthernet1/0/3,  Port ID (outgoing port): GigabitEthernet0/1
 IP address: 000.000.000.006
Device ID: ING_CIVIL_DIR
 IP address: 000.000.0.007
Interface: GigabitEthernet1/0/10,  Port ID (outgoing port): GigabitEthernet0/2
Device ID: ING_CIVIL
 IP address: 000.000.000.008
Interface: GigabitEthernet1/0/7,  Port ID (outgoing port): GigabitEthernet0/2
 IP address: 000.000.000.008
Device ID: Ingenieria_Posgrado
 IP address: 000.000.000.009
Interface: GigabitEthernet1/0/8,  Port ID (outgoing port): GigabitEthernet0/1
 IP address: 000.000.000.009
Device ID: Biblio_Barragan
 IP address: 000.000.000.10
Interface: GigabitEthernet1/0/2,  Port ID (outgoing port): GigabitEthernet0/1
 IP address: 000.000.000.10
Device ID: Electronica_Edif_3
 IP address: 000.000.000.011
Interface: GigabitEthernet1/0/5,  Port ID (outgoing port): GigabitEthernet0/1
 IP address: 000.000.000.011
]0;cesar@cesar-HP-Pavilion-15-NoteBook-PC: ~cesar@cesar-HP-Pavilion-15-NoteBook-PC:~$ awk '/Device ID|IP address|Interface|Port ID/ { print }' CDPdet.dat >tabladetallada.dat 

文件 2:

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

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

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

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

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

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

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

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

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

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

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

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

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


Barragan_3750>

我希望將所有資訊以正確的順序放置在同一個文件中,如下所示:

Device ID: BIOTERIO
IP address: 000.000.00.001
Interface: GigabitEthernet1/0/6  
Port ID (outgoing port): GigabitEthernet0/1
SN: P7K06UQ

Device ID: N7K-LAN(JAF1651ANDL)
IP address: 000.000.0.002
Interface: GigabitEthernet1/0/1  
Port ID (outgoing port): Ethernet7/23
SN: H006K082

Device ID: LAB_PESADO
IP address: 000.000.000.003
Interface: GigabitEthernet1/0/11
Port ID (outgoing port): GigabitEthernet0/1
SN: FNS174202FT
...
etc

有人知道如何使用 grep、awk 或 perl 來做到這一點嗎?

#!/bin/bash

FILE1=file1
FILE2=file2

while read line; do
   if [[ $line == Device\ ID* ]]; then
       echo -e "\n$line"
       expectIp=1
   elif [[ $line == *IP\ address* && $expectIp -eq 1 ]]; then
       sed 's/^\s*//' <<< $line
       unset expectIp
   elif [[ $line == Interface* ]]; then
       interface=$(echo $line | grep -o 'Interface[^,]*,' | sed 's/,//')
       echo $interface
       echo $line | grep -o 'Port ID.*'
       justInterface=$(echo $interface | sed 's/Interface: //')
       grep -A1 \"$justInterface\" $FILE2 | grep -o 'SN: .*'
   fi
done < $FILE1

引用自:https://unix.stackexchange.com/questions/346879