Quero armazenar em um arquivo de texto alguma instrução select que contenha variáveis como uma data:
$ cat res.txt
select field1, field2 from log and log_time~'"${TODAY}"*'
Quero usar um script que analise esse arquivo e, para cada instrução, execute-o. Claro, ${TODAY}
será substituído por uma variável.
Infelizmente, ${TODAY}
nunca é substituído por uma data quando leio o arquivo ...
Existe uma maneira de conseguir isso?
ATUALIZAR:
Digamos que eu queira iterar em um arquivo que contém algumas instruções sql e queira executá-las usando psql (postgres)
Aqui está o arquivo:
$cat sql.res
select path from log where log_host='toto' and log_time~'"${TODAY}"*' and log_msg='POLICY MISSING' and entry_status!='ACK' and path~'^/logs-${cli}/"${THREE_MONTHS_AGO}"_[0-9][0-9][0-9][0-9][0-9][0-9](_[0-9]{1,2}\.|\.)log(ptr|initial_ptr|account_ptr)?\.bz2$';
Agora, em um script bash, quero:
$cat script.sh
TODAY=$(date "+%Y-%m-%d")
THREE_MONTHS_AGO=$(date -d "$TODAY -91 days" "+%Y-%m-%d")
THREE_MONTHS_AGO_2=$(date -d "$TODAY -92 days" "+%Y-%m-%d")
ONE_MONTH_AGO=$(date -d "$TODAY -36 days" "+%Y-%m-%d")
ONE_MONTH_AGO_2=$(date -d "$TODAY -37 days" "+%Y-%m-%d")
YESTERDAY=$(date -d "$TODAY -1 day" "+%Y-%m-%d")
while read item; do
psql -P pager=off -t -c "$item" log | sed -e 's|^ *||' -e '/^$/d' > result.txt
done < sql.res
Infelizmente, as variáveis não são usadas no script. Então eu tentei avaliar. Eu tenho assim:
$while read item; do
c=$(echo $item | sed "s:':@:g" | sed "s:|:EE:g" | sed "s:(:AA:g" | sed "s:):BB:g" | sed 's:]{:TT:g' | sed 's|\.|OO|g')
b=$(eval echo ${c} 2>&1)
d=$(echo $b | sed "s:@:':g" | sed "s:EE:|:g" | sed "s:AA:(:g" | sed "s:BB:):g" | sed 's:TT:]{:g' | sed 's:OO:\\\.:g' )
echo "-> $b"
done < sql.res
Mas eu tenho alguns problemas com
\.
Responder1
Você pode simplesmente substituir a string variável pelo valor:
sed -e "s/\${TODAY}/$TODAY/g" res.txt
Mas:
- Tenha certeza absoluta de que você executou a variável por meio de um arquivo confiável (como criado pelo banco de dados fornecido ou parte de uma API de linguagem de programação popular,nãoalgo caseiro)mecanismo de fuga.
- Você também terá que escapar de qualquer personagemespecífico a
sed
(e você não pode simplesmente adicionar barras invertidas antes de cada caractere). - Você está usando dois níveis de cotações, o que provavelmente não pretendia.
- Por favor, use uma linguagem melhor que o Bash para isso. É horrível esse tipo de coisa, porque todo o negócio de cotação e fuga que complica e torna tudorealmenteé fácil perder casos especiais. Python, Ruby e até PHP lidam com esse tipo de coisa muito melhor que o Bash.