Файл cat hosts.cfg

define host {
            host_name                             switchlan
            alias                                 switchlan
            address                               192.168.2.1
            icon_image_alt                        Switch
            icon_image                            base/switch40.gif
            statusmap_image                       base/switch40.gd2
            check_command                         check-host-alive
            check_period                          24x7
            notification_period                   24x7
            contact_groups                        +admins,noc-monitor
            use                                   generic-switch
}
define host {
            host_name                             localhost
            alias                                 localhost
            address                               127.0.0.1
            icon_image_alt                        Linux
            icon_image                            base/linux40.gif
            statusmap_image                       base/linux40.gd2
            check_command                         check-host-alive
            use                                   linux-server
            contact_groups                        +admins
}

В вышеупомянутом мне нужно извлечь IP-адрес и имя хоста хоста, когда значение "use" - "Switch"

Мой текущий подход:

tr '\n' '\t' < hosts.cfg | sed s/}/}\\n/g |  sed 's/ \+ /,/g' | grep generic-switch lt4 | awk -F "," '{print $3 $ 7}'
  1. Удалить новую строку char.
  2. Снова добавьте новую строку в конце определения, когда мы увидим "}".
  3. Замените пробелы на «».
  4. Найдите строку со строкой «generic-switch».
  5. Напечатайте только имя хоста и IP-адрес.

Я предполагаю, что есть лучший подход. Пожалуйста, предложите альтернативы / оптимизации.

1 ответ1

1

Tcl будет хорошим выбором здесь: этот файл конфигурации имеет синтаксис, совместимый с Tcl:

$ cat parsehosts.tcl
proc define {name data} {
    array set host $data
    if {[string match {*switch*} [string tolower $host(use)]]} {
        puts "$host(host_name) $host(address)"
    }
}
source [lindex $argv 0]

$ tclsh parsehosts.tcl hosts.cfg
switchlan 192.168.2.1

Итак, в Bash, вы должны сказать,

read hostname address < <(tclsh parsehosts.tcl hosts.cfg)
echo $hostname
echo $address

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .