파일이 변경되는 장치에 따라 일부 Cisco 장치에 직접 연결된 장치와 관련된 모든 정보가 포함된 dispositivos.dat라는 파일이 있습니다. 다음은 파일의 예입니다.
예_1:
Device ID: CIVIL_3702-01
IP address: 148.000.000.140
Interface: FastEthernet0/47
Port ID (outgoing port): GigabitEthernet0
Device ID: SEP0c1167231e23
IP address: 148.000.000.149
Interface: FastEthernet0/16
Port ID (outgoing port): Port 1
Device ID: SEP0c116722f331
IP address: 148.000.000.162
Device ID: SEP0c116722f197
IP address: 148.000.000.155
Interface: FastEthernet0/8
Port ID (outgoing port): Port 1
Device ID: Barragan_3750
IP address: 148.000.000.129
Interface: GigabitEthernet0/1
Port ID (outgoing port): GigabitEthernet1/0/11
SN: OPC13020953
예_2:
Device ID: BIOTERIO
IP address: 148.000.00.189
Interface: GigabitEthernet1/0/6
Port ID (outgoing port): GigabitEthernet0/1
SN: P7K08UQ
Device ID: N7K-LAN(JAF1651ANDL)
IP address: 148.000.0.192
Interface: GigabitEthernet1/0/1
Port ID (outgoing port): Ethernet7/23
SN: H006K022
Device ID: LAB_PESADO
IP address: 148.000.000.130
Interface: GigabitEthernet1/0/11
Port ID (outgoing port): GigabitEthernet0/1
SN: FNS174002FT
Device ID: Arquitectura_Salones
IP address: 148.000.000.61
Interface: GigabitEthernet1/0/9
Port ID (outgoing port): GigabitEthernet0/49
SN: FNS14420533
Device ID: CIVIL_253
IP address: 148.000.000.253
Interface: GigabitEthernet1/0/4
Port ID (outgoing port): GigabitEthernet1/0/52
SN: H006K021
저는 awk를 사용하여 이 정보가 포함된 csv 파일을 생성하고 있지만 보시다시피 모든 정보가 항상 있는 것은 아닙니다. 특히 데이터베이스의 기본 키인 SN(일련 번호)에 관심이 있습니다. 내 awk 코드는 다음과 같습니다:
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"]
}' Example.dat > Example.csv
모든 장치에 SN이 있으므로 example_2에서 작동합니다.
sn,device_id,ip_address
P7K08UQ , BIOTERIO, 148.000.00.189
H006K022 , N7K-LAN(JAF1651ANDL), 148.000.0.192
FNS174002FT , LAB_PESADO, 148.000.000.130
FNS14420533 , Arquitectura_Salones, 148.000.000.61
H006K021 , CIVIL_253, 148.000.000.253
H006K083 , Arquitectura, 148.000.000.253
H006K032 , ING_CIVIL, 148.000.000.251
FNS16361SG0 , ING_CIVIL_DIR, 148.000.0.188
H006K040 , Ingenieria_Posgrado, 148.000.000.253
00000MTC1444080Z, Biblio_Barragan, 148.000.000.61
FNS11190FLE , Electronica_Edif_3, 148.000.000.253
FDO1129Z9ZJ,Barragan_3750,148.000.0.199
그러나 example_1에서는 다음과 같은 출력을 얻습니다.
sn,device_id,ip_address
, CIVIL_3702-01, 148.000.000.140
, SEP0c1167231e23, 148.000.000.149
, SEP0c116722f331, 148.000.000.162
, SEP0c116722f197, 148.000.000.155
OPC13020953 , Barragan_3750, 148.000.000.129
FCQ1622X1GH,LAB_PESADO,148.000.000.130
example_1에서는 다음과 같은 출력이 필요합니다.
sn,device_id,ip_address
OPC13020953 , Barragan_3750, 148.000.000.129
FCQ1622X1GH ,LAB_PESADO,148.000.000.130
SN이 없는 장치는 피해야 하며 어떤 경우에도 작동하려면 awk 코드가 필요합니다.
도와주세요?
미리 감사드립니다
답변1
비어 있지 않은 문자열은 true이므로 k["SN"]
진위 여부만 확인하면 됩니다. 또한 k
이전 항목의 값이 새어나오는 것을 방지하기 위해 루프의 시작이나 끝에서 전체 항목을 지우는 것이 좋습니다 .
따라서 print
해당 줄을 다음으로 바꾸십시오.
if (k["SN"]) {
print k["SN"], k["Device ID"], k["IP address"]
}
delete k;