1

In order to have a record of the devices connected to a network I'm working on an Expect script that takes information from the command Show CDP neighbors detail and saves certain fields including Device Name, IP address, Interface and Port ID (outgoing port), any of those fields work as a primary key in my Database, not even IP address cause the same IP address doesn't guaranty it is the same device. For that reason I need to catch the S/N of each device with the command show inventory, I've got both command's output in separate text files and now I need to match the information.

file1:

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 

file 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>

I would like to have all the information placed in the same file and in the correct order, something like this:

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

Does anybody know how to do that using grep, awk or perl?

1
#!/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

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.