Autor Tópico: Rotornar bloco de texto entre chaves { } - SED, AWK, etc.  (Lida 3717 vezes)

Offline viniciusstucki

  • Usuário Ubuntu
  • *
  • Mensagens: 8
    • Ver perfil
Rotornar bloco de texto entre chaves { } - SED, AWK, etc.
« Online: 13 de Maio de 2013, 08:56 »
Bom dia prezados,
Estou tendo dificuldade para realizar uma simples consulta de variaveis no meu script.
A alguns dias estou trabalhando em um script para configuração de forma autonoma do nagios, por isso estou verificando por meios de deixar tudo "configurável", atraves de um arquivo "config.cfg".
Sendo assim, eu consigo obter os valores, quando tenho o numero exato de linhas, mas gostaria de poder realizar a consulta de forma mais dinamica, podendo aumentar o tamanho ou o numero de variaveis que estão entre os campos de definição.

Um exemplo do que tenho feito esta a seguir:
Código: [Selecionar]
###################################################################
#               CONFIGURACAO DO SCRIPT NAGIOS V1.0#               #
###################################################################
DIR_CONFIG=/usr/local/nagios/etc

#CONFIGURACOES DE HOSTS

CONFIG LINUX_SERVER {
        HOSTGROUP=linux-server
        CONFIG_FILE=server_linux.cfg
}

CONFIG WINDOWS_SERVER {
        HOSTGROUP=windows-server
        CONFIG_FILE=server_windows.cfg
}

CONFIG WINDOWS_CLIENT {
        HOSTGROUP=windows-client
        CONFIG_FILE=client_windows.cfg
}

CONFIG NET_PRINTERS {
        HOSTGROUP=net_printers
        CONFIG_FILE=net_printers.cfg
}

-------------------------------------------------------------------------------------------------------------------

Gostaria de saber se tem algum meio, ja vi alguns exemplos do SED, como este:

Código: [Selecionar]
sed -e ':a;/}/!{N;ba};/CONFIG WINDOWS_CLIENT/p' config.cfg
Mas não funcionou.

O mais proximo que cheguei foi atraves da busca por linhas do grep (opção -A 3).

Caso alguém saiba pelo que eu tenho de pesquisar ou ja conheça um codigo que faça isso, fico muito grato.
« Última modificação: 13 de Maio de 2013, 09:06 por viniciusstucki »

Offline irtigor

  • Equipe Ubuntu
  • Usuário Ubuntu
  • *****
  • Mensagens: 4.344
  • Delete, delete, delete!
    • Ver perfil
Re: Rotornar bloco de texto entre chaves { } - SED, AWK, etc.
« Resposta #1 Online: 13 de Maio de 2013, 12:22 »
Você está escrevendo um parser, seria mais fácil se usasse um formato padronizado, porque já existem soluções prontas para elas, e evita problemas (algo como xml ou ini file). Outro ponto, é que até dá pra usar bash, mas em outras linguagens interpretadas (ruby, python ou perl, por exemplo), a coisa é mais simples e robusta, principalmente se optar por um dos formatos que mencionei.

-----
Alternativamente, você poderia escrever esse arquivo com bash válido, bastando um "source" no script principal. Pra isso, seria necessário alterar as seções pra arrays ou funções, por exemplo. Se não for mudar de linguagem, na minha opinião, essa é a solução mais elegante.
« Última modificação: 13 de Maio de 2013, 12:38 por irtigor »

Offline viniciusstucki

  • Usuário Ubuntu
  • *
  • Mensagens: 8
    • Ver perfil
Re: Rotornar bloco de texto entre chaves { } - SED, AWK, etc.
« Resposta #2 Online: 13 de Maio de 2013, 12:49 »
Poderia me dar algum exemplo, na verdade nunca me aprofundei muito com o Shell Script, entao só pensei em criar um arquivo de configuração como meio de facilitar. De todo modo, eu estou tentando criar um arquivo que eu possa manipular com o proprio script mais tarde, tipo um gerenciador de configurações.

Offline irtigor

  • Equipe Ubuntu
  • Usuário Ubuntu
  • *****
  • Mensagens: 4.344
  • Delete, delete, delete!
    • Ver perfil
Re: Rotornar bloco de texto entre chaves { } - SED, AWK, etc.
« Resposta #3 Online: 13 de Maio de 2013, 14:17 »
Usando array associativo, poderia ser algo como:

./config.cfg
Código: [Selecionar]
CONFIG_DIR="/algum/lugar"

declare -A LINSERVER

LINSERVER=(
[HOSTGROUP]="windows-server"
[CONFIG_FILE]="windows.cfg"
)

./teste.sh
Código: [Selecionar]
#!/usr/bin/env bash

[[ -f "config.cfg" ]] && source config.cfg

echo $CONFIG_DIR
echo ${LINSERVER[HOSTGROUP]}

Offline viniciusstucki

  • Usuário Ubuntu
  • *
  • Mensagens: 8
    • Ver perfil
Re: Rotornar bloco de texto entre chaves { } - SED, AWK, etc.
« Resposta #4 Online: 13 de Maio de 2013, 15:10 »
Funciona! rsrs

Muito obrigado Irtigor, foi de grande valor a ajuda.

Esse metodo só me permite o acesso ao arquivo, correto, assim a manipulação dele ainda deve ficar por conta de um StreamEditor, como o sed ou awk, correto?

Offline irtigor

  • Equipe Ubuntu
  • Usuário Ubuntu
  • *****
  • Mensagens: 4.344
  • Delete, delete, delete!
    • Ver perfil
Re: Rotornar bloco de texto entre chaves { } - SED, AWK, etc.
« Resposta #5 Online: 13 de Maio de 2013, 16:57 »
"config.cfg" é um script bash válido, como outro qualquer, que nesse caso só contem variáveis, e é incorporado pelo "teste.sh". Isso não te impede de adicionar alguma coisa inválida, como comentário, que possa ser extraída com sed ou awk, mas não é a ideia.