텍스트 파일 정보로 mySQL 데이터베이스 채우기

텍스트 파일 정보로 mySQL 데이터베이스 채우기

awk저는 네트워크에 연결된 장치에 대한 정보를 얻기 위해 일부 cisco 명령을 사용해 왔습니다 . 이 스크립트는 텔넷을 통해 특정 장치에 연결하고 장치의 IP, serial numbername(장치 ID)를 가져오고 다음과 같은 텍스트 파일을 생성합니다.

SN: FDO1129Z9ZQ
Barragan_3750
IP address: 148.228.4.197

그런 다음 연결된 장치에 요청하고 다음과 같은 두 번째 파일을 생성합니다.

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 

MySQL이 정보를 데이터베이스에 넣어야 하므로 다음과 같은 두 개의 테이블이 있는 데이터베이스를 만들었습니다.

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

이제 이 데이터베이스를 파일 정보로 채워야 하는데 솔직히 어떻게 해야 할지 모르겠습니다. 스크립트에 루프를 만들어야 한다고 생각하지만 그게 전부입니다.

도움이 필요하세요?

미리 감사드립니다.

업데이트: 허용된 답변 코드를 사용하여 다음 결과를 얻었습니다.

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

" "을(를) 사용하면 load data infile정보가 잘못된 필드에 채워집니다.

"writer"를 사용하여 .cvs 파일을 열면 구분 기호와 줄 바꿈은 정확하지만 gedit를 사용하지 않는 것으로 나타났습니다.

둘 다 같은 파일이에요

.cvs 파일을 수동으로 편집하고 쉼표와 줄 바꿈을 올바르게 배치하면 " load data infile" 기능이 완벽하게 작동합니다.

답변1

보고서를 생성하는 것은 INSERT번거로우며, 더 쉬운 방법은 CSV를 사용하여 파일을 CSV로 변환 awk한 다음 mysqlimportCSV를 사용하여 결과를 관련 테이블로 가져오는 것입니다.

첫 번째 테이블의 경우 변환은 다음과 같습니다.

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

결과는 다음과 같아야 합니다.

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

그런 다음 합계가 Device_SN_O무엇 인지 이해한다고 가정하고 두 번째 테이블에 대해 다음을 수행할 수 있습니다.Device_SN_D

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

결과는 다음과 같습니다.

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

그럼 넌 할 수 있어수입CSV 파일을 MySQL로 가져옵니다.

관련 정보