awk는 조건을 확인하고 조건이 참이면 인쇄합니다.

awk는 조건을 확인하고 조건이 참이면 인쇄합니다.

파일이 변경되는 장치에 따라 일부 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;

관련 정보