preenche o banco de dados mySQL com informações de arquivo de texto

0

Eu tenho usado awk e alguns comandos Cisco para obter informações sobre dispositivos conectados a uma rede, o script se conecta via telnet a determinado dispositivo, use os IP , serial number e name (dispositivo id) deste dispositivo e gerar um arquivo de texto como este:

SN: FDO1129Z9ZQ
Barragan_3750
IP address: 148.228.4.197

Em seguida, ele solicita os dispositivos conectados a este equipamento e gera um segundo arquivo como este:

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

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

Device ID: LAB_PESADO
IP address: 148.228.131.133
Interface: GigabitEthernet1/0/11
Port ID (outgoing port): GigabitEthernet0/1
SN: FNS174002FY    

Device ID: Arquitectura_Salones
IP address: 148.228.135.33
Interface: GigabitEthernet1/0/9
Port ID (outgoing port): GigabitEthernet0/49
SN: FNS14420544    

Device ID: CIVIL_253
IP address: 148.228.132.256
Interface: GigabitEthernet1/0/4
Port ID (outgoing port): GigabitEthernet1/0/52
SN: H006K042    

Device ID: Arquitectura
IP address: 148.228.134.456
Interface: GigabitEthernet1/0/3
Port ID (outgoing port): GigabitEthernet0/1
SN: H006K044      

Device ID: ING_CIVIL
IP address: 148.228.133.234
Interface: GigabitEthernet1/0/7
Port ID (outgoing port): GigabitEthernet0/2
SN: H006K011       

Device ID: ING_CIVIL_DIR
IP address: 148.228.4.987
Interface: GigabitEthernet1/0/10
Port ID (outgoing port): GigabitEthernet0/2
SN: FNS16361SW1    

Device ID: Ingenieria_Posgrado
IP address: 148.228.137.343
Interface: GigabitEthernet1/0/8
Port ID (outgoing port): GigabitEthernet0/1
SN: H006K432   

Device ID: Biblio_Barragan
IP address: 148.228.136.45
Interface: GigabitEthernet1/0/2
Port ID (outgoing port): GigabitEthernet0/1
SN: 00000MTC1444080D

Device ID: Electronica_Edif_3
IP address: 148.228.130.345
Interface: GigabitEthernet1/0/5
Port ID (outgoing port): GigabitEthernet0/1
SN: FNS11190FRT 

Eu preciso que essa informação seja colocada em um banco de dados MySQL , então eu criei um banco de dados com duas tabelas como esta:

+------------------+
| Tables_in_db_cdp |
+------------------+
| Trelaciones      |
| dispositivos     |
+------------------+

mysql> DESCRIBE dispositivos;
+------------+-------------+------+-----+---------+-------+
| Field      | Type        | Null | Key | Default | Extra |
+------------+-------------+------+-----+---------+-------+
| sn         | varchar(20) | NO   | PRI | NULL    |       |
| device_id  | varchar(25) | NO   |     | NULL    |       |
| ip_address | varchar(15) | NO   |     | NULL    |       |
+------------+-------------+------+-----+---------+-------+

mysql> DESCRIBE Trelaciones
    -> ;
+-------------+-------------+------+-----+---------+----------------+
| Field       | Type        | Null | Key | Default | Extra          |
+-------------+-------------+------+-----+---------+----------------+
| id          | int(11)     | NO   | PRI | NULL    | auto_increment |
| Device_SN_O | varchar(25) | NO   |     | NULL    |                |
| Device_SN_D | varchar(25) | NO   |     | NULL    |                |
| Interface   | varchar(25) | NO   |     | NULL    |                |
| Port_ID     | varchar(25) | NO   |     | NULL    |                |
+-------------+-------------+------+-----+---------+----------------+

Agora eu preciso preencher este banco de dados com as informações dos arquivos, mas honestamente eu não sei como fazer isso, eu suponho que eu preciso fazer um ciclo em um script, mas isso é tudo,

Alguma ajuda?

obrigado antecipadamente.

ATUALIZAÇÃO: usando os códigos da resposta aceita, obtive este resultado:

Device_SN_O,Device_SN_D,Interface,Port_ID
FDO1129Z9ZJ
,P7K08UQ         
,GigabitEthernet1/0/6,GigabitEthernet0/1
FDO1129Z9ZJ
,H006K022        
,GigabitEthernet1/0/1,Ethernet7/23
FDO1129Z9ZJ
,FNS174002FT     
,GigabitEthernet1/0/11,GigabitEthernet0/1
FDO1129Z9ZJ
,FNS14420533     
,GigabitEthernet1/0/9,GigabitEthernet0/49
FDO1129Z9ZJ
,H006K021        
,GigabitEthernet1/0/4,GigabitEthernet1/0/52
FDO1129Z9ZJ
,H006K083        
,GigabitEthernet1/0/3,GigabitEthernet0/1
FDO1129Z9ZJ
,H006K032        
,GigabitEthernet1/0/7,GigabitEthernet0/2
FDO1129Z9ZJ
,FNS16361SG0     
,GigabitEthernet1/0/10,GigabitEthernet0/2
FDO1129Z9ZJ
,H006K040        
,GigabitEthernet1/0/8,GigabitEthernet0/1
FDO1129Z9ZJ
,00000MTC1444080Z
,GigabitEthernet1/0/2,GigabitEthernet0/1
FDO1129Z9ZJ
,FNS11190FLE     
,GigabitEthernet1/0/5,GigabitEthernet0/1

Quando eu uso " load data infile ", as informações são preenchidas em campos errados.

Tenho notado que, se eu abrir o arquivo .cvs com "writer", os separadores e as linhas de quebra estão corretos, mas não com o gedit:

Seeueditaroarquivo.cvsmanualmenteecolocarvírgulaselinhasdequebracorretamente,afunção" load data infile " funcionará perfeitamente.

    
por Cesar Alejandro Villegas Yepez 02.03.2017 / 06:35

1 resposta

3

A geração de INSERT declarações é confusa, uma maneira mais fácil é converter seus arquivos para CSV com awk e usar mysqlimport para importar os resultados para as tabelas relevantes.

Para a primeira tabela, a conversão pode ser algo assim:

awk '
    BEGIN {
        RS = "\n\n"
        FS = "\n"
        OFS = ","
        print "sn,device_id,ip_address"
    }
    {
        for(i=1; i<=NF; i++) {
            split($i, a, ": ");
            k[a[1]] = a[2]
        }
        print k["SN"], k["Device ID"], k["IP address"]
    }' file2.txt > table1.csv

Os resultados devem ficar assim:

sn,device_id,ip_address
P7K08UR,BIOTERIO,148.228.83.140
H006K024,N7K-LAN(JAF1651ANDL),148.228.4.193
FNS174002FY,LAB_PESADO,148.228.131.133
FNS14420544,Arquitectura_Salones,148.228.135.33
H006K042,CIVIL_253,148.228.132.256
H006K044,Arquitectura,148.228.134.456
H006K011,ING_CIVIL,148.228.133.234
FNS16361SW1,ING_CIVIL_DIR,148.228.4.987
H006K432,Ingenieria_Posgrado,148.228.137.343
00000MTC1444080D,Biblio_Barragan,148.228.136.45
FNS11190FRT,Electronica_Edif_3,148.228.130.345

Então, assumindo que eu entendo o que Device_SN_O e Device_SN_D devem ser, para a segunda tabela você pode fazer algo assim:

awk -v orig=$(awk '$1=="SN:" {print $2}' file1.txt) '
    BEGIN {
        RS = "\n\n"                                               
        FS = "\n"                                                 
        OFS = ","                                                 
        print "Device_SN_O,Device_SN_D,Interface,Port_ID"         
    }                                                             

    {                                                             
        for(i=1; i<=NF; i++) {                                    
            split($i, a, ": ");                                   
            k[a[1]] = a[2]                                        
        }                                                         
        print orig, k["SN"], k["Interface"], k["Port ID (outgoing port)"]
    }' file2.txt > table2.csv

Os resultados seriam os seguintes:

Device_SN_O,Device_SN_D,Interface,Port_ID
FDO1129Z9ZQ,P7K08UR,GigabitEthernet1/0/6,GigabitEthernet0/1
FDO1129Z9ZQ,H006K024,GigabitEthernet1/0/1,Ethernet7/23
FDO1129Z9ZQ,FNS174002FY,GigabitEthernet1/0/11,GigabitEthernet0/1
FDO1129Z9ZQ,FNS14420544,GigabitEthernet1/0/9,GigabitEthernet0/49
FDO1129Z9ZQ,H006K042,GigabitEthernet1/0/4,GigabitEthernet1/0/52
FDO1129Z9ZQ,H006K044,GigabitEthernet1/0/3,GigabitEthernet0/1
FDO1129Z9ZQ,H006K011,GigabitEthernet1/0/7,GigabitEthernet0/2
FDO1129Z9ZQ,FNS16361SW1,GigabitEthernet1/0/10,GigabitEthernet0/2
FDO1129Z9ZQ,H006K432,GigabitEthernet1/0/8,GigabitEthernet0/1
FDO1129Z9ZQ,00000MTC1444080D,GigabitEthernet1/0/2,GigabitEthernet0/1
FDO1129Z9ZQ,FNS11190FRT,GigabitEthernet1/0/5,GigabitEthernet0/1

Então você pode importar os arquivos CSV para o MySQL.

    
por 02.03.2017 / 07:57