awk проверить и распечатать, когда это правда

У меня есть файл с именем dispositivos.dat, в котором у меня есть вся информация, связанная с устройствами, напрямую связанными с определенным оборудованием Cisco, в зависимости от оборудования, изменения файла, это примеры этого файла:

Example_1:

  • Есть ли более элегантный способ подсчета слов и присвоение этому числу переменных?
  • Bash Scripting: Как ограничить количество опций в цикле выбора?
  • Устройство USB должно быть обнаружено в «той же» / dev точке всегда?
  • Проблема с awk-совпадением
  • cmd2 `cmd1` vs cmd1 | xargs cmd2
  • awk: печатать строки после матча до конца файла
  • 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 

    Example_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 

    Он отлично работает для Example_2, потому что у каждого устройства есть SN:

     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 

    Но в примере_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 для работы в любом случае.

    Не могли бы вы помочь мне?

    заранее спасибо

  • скрипт для регистрации всех статистических данных для определенного процесса
  • Как эхо экранировать экранированную строку
  • Восстановленные удаленные файлы на Mac по командной строке
  • сравнить 2 столбца из 2 разных CSV-файлов
  • Преобразование нескольких файлов из разделителя табуляции в CSV-файл с разделителями-запятыми
  • Есть два способа установить awk vars через командную строку?
  • One Solution collect form web for “awk проверить и распечатать, когда это правда”

    Непустая строка истинна, поэтому вы можете просто проверить k["SN"] на правду. Кроме того, я бы предложил очистить все k в начале или в конце цикла, чтобы избежать значений из предыдущего элемента, истекающего кровью.

    Итак, замените строку print на что-то вроде:

     if (k["SN"]) { print k["SN"], k["Device ID"], k["IP address"] } delete k; 
    Linux и Unix - лучшая ОС в мире.