Rotornar bloco de texto entre chaves { } - SED, AWK, etc.

Iniciado por viniciusstucki, 13 de Maio de 2013, 08:56

tópico anterior - próximo tópico

viniciusstucki

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:

###################################################################
#               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:

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.

irtigor

#1
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.

viniciusstucki

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.

irtigor

Usando array associativo, poderia ser algo como:

./config.cfg

CONFIG_DIR="/algum/lugar"

declare -A LINSERVER

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


./teste.sh

#!/usr/bin/env bash

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

echo $CONFIG_DIR
echo ${LINSERVER[HOSTGROUP]}

viniciusstucki

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?

irtigor

"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.