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