Extrai as picadas entre um delimitador se corresponder a uma determinada cadeia

0

Arquivo gato 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
}

Acima, preciso extrair o endereço IP e o nome do host do host quando o valor "use" for "Switch"

Minha abordagem atual:

tr '\n' '\t' < hosts.cfg | sed s/}/}\n/g |  sed 's/ \+ /,/g' | grep generic-switch lt4 | awk -F "," '{print $3 $ 7}'
  1. Remover nova linha de caracteres.
  2. Adicione nova linha novamente no final da definição sempre que virmos "}".
  3. Substituir espaços em branco por "'".
  4. Encontre a linha com a string "generic-switch".
  5. Imprima apenas o nome do host e o endereço IP.

Eu suponho que há uma abordagem melhor. Por favor sugira alternativas / otimizações.

    
por naresh paturi 13.03.2014 / 18:27

1 resposta

1

Tcl seria uma boa escolha aqui: esse arquivo de configuração tem uma sintaxe compatível com 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

Então, no bash, você deve dizer

read hostname address < <(tclsh parsehosts.tcl hosts.cfg)
echo $hostname
echo $address
    
por 13.03.2014 / 20:07

Tags