Como interpretar variáveis armazenadas num arquivo

1. Como interpretar variáveis armazenadas num arquivo

Debian Brasil
debianbrasil

(usa Debian)

Enviado em 18/09/2018 - 13:38h

Olá, boa tarde caros amigos!

Estava refatorando um script antigo que tenho aqui, que tem por objetivo mostrar um arquivo CSV já preenchido com alguns dados de monitoramento.

Já tenho o script montando há muito tempo, porém ele faz bastante uso de sed, cat e etc...

Tive a ideia de refatorá-lo com o intuito de aumentar o desempenho.

Pois bem, deparei num problema e ainda não encontrei solução.

Já li tudo quanto é manual de referência, dicas e etc, inclusive em outros idiomas e não achei uma solução plausível, ou devo ter péssima qualidade para interpretar textos.

O que eu pretendo, com a ajuda dos amigos é a seguinte solução:

Tenho os seguintes arquivos:
result.tpl
monitor.sh


O script monitor tem algumas variáveis definidas com conteúdo que não posso revelar, mas vou exemplificar:

arquivo monitor.sh


kernel="versão do kernel"
system="nome do sistema"
date="data atual"
user="usuário logado"



arquivo result.tpl

SISTEMA,KERNEL,USUARIO,DATA
$system,$kernel,$user,$date



o script gera um arquivo result.csv.
Porém, tenho que "parsear" todas as variáveis do arquivo "result.tpl" antes de gerar o resultado final, o que é algo como:

final=$(sed "s/$system/$system/g" result.tpl)

E assim faço com cada varável no intuito de substituir o valor da variável do script pela variável no arquivo "result.tpl".

A pergunta é:

Vocês conhecem alguma solução que permite interpretar as variáveis do arquivo "result.tpl" dentro do script sem precisar "parsear na unha"?

Algo como:

monitor. sh "result.tpl"

e ele já interpreta as variáveis dento do "result.tpl"?

Eu consegui com o cat <<EOF, porém tenho que misturar arquivos de programação com o arquivo de template, algo que não quero.


a intenção é algo parecido com:


#!/bin/bash

kernel="versão do kernel"
system="nome do sistema"
date="data atual"
user="usuário logado"

template="result.tpl"
final="result.csv"

function renderTemplate(){
echo $template > $final
}


Só que ao invés de imprimir na tela o conteudo exato do arquivo "result.tpl", ele imprimir o resultado dele já com as variáveis interpretadas com os valores das variáveis já definidos no script?


Espero não ter explicado mal, e que os amigos possam me ajudar!

Desde já, sou grato pela atenção e prometo testar todas as opções que os amigos, de boa vontade, me ensinarem.


  


2. Re: Como interpretar variáveis armazenadas num arquivo

Marcelo Oliver
msoliver

(usa Debian)

Enviado em 18/09/2018 - 14:49h

debianbrasil escreveu:

Olá, boa tarde caros amigos!

Estava refatorando um script antigo que tenho aqui, que tem por objetivo mostrar um arquivo CSV já preenchido com alguns dados de monitoramento.

Já tenho o script montando há muito tempo, porém ele faz bastante uso de sed, cat e etc...

Tive a ideia de refatorá-lo com o intuito de aumentar o desempenho.

Pois bem, deparei num problema e ainda não encontrei solução.

Já li tudo quanto é manual de referência, dicas e etc, inclusive em outros idiomas e não achei uma solução plausível, ou devo ter péssima qualidade para interpretar textos.

O que eu pretendo, com a ajuda dos amigos é a seguinte solução:

Tenho os seguintes arquivos:
result.tpl
monitor.sh


O script monitor tem algumas variáveis definidas com conteúdo que não posso revelar, mas vou exemplificar:

arquivo monitor.sh


kernel="versão do kernel"
system="nome do sistema"
date="data atual"
user="usuário logado"



arquivo result.tpl

SISTEMA,KERNEL,USUARIO,DATA
$system,$kernel,$user,$date



o script gera um arquivo result.csv.
Porém, tenho que "parsear" todas as variáveis do arquivo "result.tpl" antes de gerar o resultado final, o que é algo como:

final=$(sed "s/$system/$system/g" result.tpl)

E assim faço com cada variável no intuito de substituir o valor da variável do script pela variável no arquivo "result.tpl".

A pergunta é:

Vocês conhecem alguma solução que permite interpretar as variáveis do arquivo "result.tpl" dentro do script sem precisar "parsear na unha"?

Algo como:

monitor. sh "result.tpl"

e ele já interpreta as variáveis dento do "result.tpl"?

Eu consegui com o cat <<EOF, porém tenho que misturar arquivos de programação com o arquivo de template, algo que não quero.


a intenção é algo parecido com:


#!/bin/bash

kernel="versão do kernel"
system="nome do sistema"
date="data atual"
user="usuário logado"

template="result.tpl"
final="result.csv"

function renderTemplate(){
echo $template > $final
}


Só que ao invés de imprimir na tela o conteudo exato do arquivo "result.tpl", ele imprimir o resultado dele já com as variáveis interpretadas com os valores das variáveis já definidos no script?


Espero não ter explicado mal, e que os amigos possam me ajudar!

Desde já, sou grato pela atenção e prometo testar todas as opções que os amigos, de boa vontade, me ensinarem.


Boa tarde DebianBrasil.
Vamos ver se entendi....
Você deseja "pegar" os valores que estão no arquivo:
arquivo result.tpl
SISTEMA,KERNEL,USUARIO,DATA
$system,$kernel,$user,$date

E atribuir o valor dos mesmos para as variáveis no script?
É isso...

Marcelo Oliver




3. Re: Como interpretar variáveis armazenadas num arquivo

Debian Brasil
debianbrasil

(usa Debian)

Enviado em 18/09/2018 - 21:00h

msoliver escreveu:

debianbrasil escreveu:

Olá, boa tarde caros amigos!

Estava refatorando um script antigo que tenho aqui, que tem por objetivo mostrar um arquivo CSV já preenchido com alguns dados de monitoramento.

Já tenho o script montando há muito tempo, porém ele faz bastante uso de sed, cat e etc...

Tive a ideia de refatorá-lo com o intuito de aumentar o desempenho.

Pois bem, deparei num problema e ainda não encontrei solução.

Já li tudo quanto é manual de referência, dicas e etc, inclusive em outros idiomas e não achei uma solução plausível, ou devo ter péssima qualidade para interpretar textos.

O que eu pretendo, com a ajuda dos amigos é a seguinte solução:

Tenho os seguintes arquivos:
result.tpl
monitor.sh


O script monitor tem algumas variáveis definidas com conteúdo que não posso revelar, mas vou exemplificar:

arquivo monitor.sh


kernel="versão do kernel"
system="nome do sistema"
date="data atual"
user="usuário logado"



arquivo result.tpl

SISTEMA,KERNEL,USUARIO,DATA
$system,$kernel,$user,$date



o script gera um arquivo result.csv.
Porém, tenho que "parsear" todas as variáveis do arquivo "result.tpl" antes de gerar o resultado final, o que é algo como:

final=$(sed "s/$system/$system/g" result.tpl)

E assim faço com cada variável no intuito de substituir o valor da variável do script pela variável no arquivo "result.tpl".

A pergunta é:

Vocês conhecem alguma solução que permite interpretar as variáveis do arquivo "result.tpl" dentro do script sem precisar "parsear na unha"?

Algo como:

monitor. sh "result.tpl"

e ele já interpreta as variáveis dento do "result.tpl"?

Eu consegui com o cat <<EOF, porém tenho que misturar arquivos de programação com o arquivo de template, algo que não quero.


a intenção é algo parecido com:


#!/bin/bash

kernel="versão do kernel"
system="nome do sistema"
date="data atual"
user="usuário logado"

template="result.tpl"
final="result.csv"

function renderTemplate(){
echo $template > $final
}


Só que ao invés de imprimir na tela o conteudo exato do arquivo "result.tpl", ele imprimir o resultado dele já com as variáveis interpretadas com os valores das variáveis já definidos no script?


Espero não ter explicado mal, e que os amigos possam me ajudar!

Desde já, sou grato pela atenção e prometo testar todas as opções que os amigos, de boa vontade, me ensinarem.


Boa tarde DebianBrasil.
Vamos ver se entendi....
Você deseja "pegar" os valores que estão no arquivo:
arquivo result.tpl
SISTEMA,KERNEL,USUARIO,DATA
$system,$kernel,$user,$date

E atribuir o valor dos mesmos para as variáveis no script?
É isso...

Marcelo Oliver



Exatamente!

Primeiramente, obrigado por responder!

Atualmente eu uso o sed para substituir os valores marcados como variáveis no "result.tpl" pelos valores das variáveis salvos no script.

Já vi algo parecido, fazer com que as "variaveis" salvas num txt fossem renderizadas com echo.

Mas não lembro onde, se não me engano, foi em 2012.


4. Re: Como interpretar variáveis armazenadas num arquivo

Marcelo Oliver
msoliver

(usa Debian)

Enviado em 18/09/2018 - 22:45h

Boa noite DebianBrasil.
Quais os valores das variáveis em:
arquivo result.tpl
SISTEMA,KERNEL,USUARIO,DATA
$system,$kernel,$user,$date

Desculpe mas não entendi essa parte.... :)


5. Re: Como interpretar variáveis armazenadas num arquivo

Debian Brasil
debianbrasil

(usa Debian)

Enviado em 18/09/2018 - 23:22h

msoliver escreveu:

Boa noite DebianBrasil.
Quais os valores das variáveis em:
arquivo result.tpl
SISTEMA,KERNEL,USUARIO,DATA
$system,$kernel,$user,$date

Desculpe mas não entendi essa parte.... :)


Ah, o erri foi meu em não explicar corretamente.

As variáveis existem no script, todas possuem valores.
No arquivo de template estão somente os locais onde as variáveis deverão ser substituidas pelo valor real das variáveis do script.

script monitor.sh

#!/bin/bash

kernel="versão do kernel"
system="nome do sistema"
date="data atual"
user="usuário logado"

template="result.tpl"
final="result.csv"

function renderTemplate(){
echo $template > $final
}


arquivo de template: result.tpl

SISTEMA,KERNEL,USUARIO,DATA
$system,$kernel,$user,$date



Eu preciso que as variáveis dentro do arquivo result.tpl sejam trocadas pelos valores das mesmas variáveis dentro do script, no cabeçalho.

Entende?

Lembrando que são só exemplos; o script tem mais coisas, só coloquei esta parte como exemplo.


Basicamente eu uso o sed para trocar as strings que começam com "$" do arquivo .tpl pelos valores das variáveis com o mesmo nome.

só como exemplo de como funciona atualmente:
script monitor.sh

#!/bin/bash

kernel="versão do kernel"
system="nome do sistema"
date="data atual"
user="usuário logado"

template="result.tpl"
final="result.csv"

function renderTemplate(){
local template=$1
local key=$2
local value=$3

result=$(sed "s/$key/$value/g" $template)

echo "$result" > $final

}

renderTemplate [parametros]



Como neste exemplo, uso um for, nele passo as chaves e os valores para a função "renderTemplate".
Assim consigo substituir os valores do arquivo *.tpl que começam com "$", pelos valores das variáveis definidas no script.

Espero que tenha ficado mais fácil agora.



6. Re: Como interpretar variáveis armazenadas num arquivo

Marcelo Oliver
msoliver

(usa Debian)

Enviado em 19/09/2018 - 15:46h

Boa tarde.
Se eu entendi.... é isso....
#!/bin/bash

system="$(uname -o)"
kernel="$(uname -r)"
user="$USER"
data="$(date)"

# -- Delimitadores do SED trocados por "#" --
if [[ "$1" =~ (system|kernel|user|data) ]];then #argumentos válidos
sed -i "2s#\$"$1"#${!1}#" result.tpl
echo "${!1}" >> result.csv
elif [[ "$1" =~ ^(tudo)$ ]];then
#troca tudo
sed -i "2s#.*#$system\,$kernel\,$user\,$data#" result.tpl
cat result.tpl > result.csv
else
echo -e "\nArgumento inválido\n"
fi

Obs.:
Informe somente um argumento, que deve ser:
system|kernel|user|data
ou
tudo, para trocar todos valores de result.tpl

Marcelo Oliver


7. Re: Como interpretar variáveis armazenadas num arquivo

Debian Brasil
debianbrasil

(usa Debian)

Enviado em 19/09/2018 - 19:42h

msoliver escreveu:

Boa tarde.
Se eu entendi.... é isso....
#!/bin/bash

system="$(uname -o)"
kernel="$(uname -r)"
user="$USER"
data="$(date)"

# -- Delimitadores do SED trocados por "#" --
if [[ "$1" =~ (system|kernel|user|data) ]];then #argumentos válidos
sed -i "2s#\$"$1"#${!1}#" result.tpl
echo "${!1}" >> result.csv
elif [[ "$1" =~ ^(tudo)$ ]];then
#troca tudo
sed -i "2s#.*#$system\,$kernel\,$user\,$data#" result.tpl
cat result.tpl > result.csv
else
echo -e "\nArgumento inválido\n"
fi

Obs.:
Informe somente um argumento, que deve ser:
system|kernel|user|data
ou
tudo, para trocar todos valores de result.tpl

Marcelo Oliver


Marcelo Oliver, muito obrigado por responder!

Atualmente o script já funciona de modo parecido, só que não uso o "sed -i" pois o arquivo de template não pode ser modificado.
Ele serve apenas como um molde para o script preencher as informações e gerar um CSV.

Já tenho o script há alguns anos rodando num concentrador de pagamentos.
O script usa vários arquivos .tpl, um para cada tipo de pagamento e outros para cada subtipo de pagamento, exemplo: Cartão->crédito->visa.

E por ai vai.

Por isso o script que fiz recebe $key e $value como argumento.

O que eu queria, e já cheguei a algo parecido, era não ter que usar o SED para substituir os dados no arquivo *tpl na hora de renderizar.
Pois devido a quantidade de arquivos e de dados que o script processa, usar o sed várias vezes no mesmo arquivo torna o script lento.

Antes de criar o arquivo TPL fisicamente, seu conteúdo era guardado dentro de um arquivo .sh e funciona sem SED, as variáveis do script são atribuidas dinamicamente também, ou seja, o script já tem as variáveis com os valores configurados, cada valor recebe um array e ele só precisa preencher o template e renderizar em CSV.

Atualmente funciona mais ou menos assim (esse é um mini-exemplo):

monitor.sh
#!/bin/bash
system="$(uname -o)"
kernel="$(uname -r)"
user="$USER"
data="$(date)"
template="$(source $1)"
result="result.csv"

echo "$template" >> $result


arquivo result.sh

#!/bin/bash
cat << EOF
SISTEMA,KERNEL,USUARIO,DATA
$system,$kernel,$user,$date
EOF


Dai tenho vários arquivos "result.sh" que são usados como template para o csv e as variáveis todas (são dezenas) já estão todas com valores atribuidos dinamicamente no script "monitor.sh", percorro o diretorio de templates e vou renderizando um a um.

O que eu queria era um funcionamento parecido, porém não queria ter um arquivo .sh como se fosse um script para servir apenas como template; gostaria de separar os templates dos scripts e só preenche-los na hora de renderizar, entende?

Eu tenho um pouco de conhecimento em shell script, não muito avançado, mas o suficiente para me virar por aqui, só que pesquisei bastante e não encontrei uma solução, mesmo já tendo visto algo que funciona assim numa empresa que trabalhei entre 2011 e 2015.






Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts