ファイルが変更されるデバイスによっては、一部のCiscoデバイスに直接接続されているデバイスに関するすべての情報を含むdispositius.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;