Eu tentei várias coisas sem sorte, então talvez um de vocês especialistas possa me ajudar (espero!).
Eu quero armazenar em um arquivo de texto alguma declaração select que contenha variáveis como uma data:
$ cat res.txt
select field1, field2 from log and log_time~'"${TODAY}"*'
Eu quero usar um script que analise este arquivo e para cada instrução, execute-o. É claro que ${TODAY}
será substituído por uma variável.
Infelizmente, o ${TODAY}
nunca é substituído por uma data em que eu li o arquivo ...
Existe uma maneira de conseguir isso?
ATUALIZAÇÃO:
Vamos dizer que eu quero iterar através de um arquivo que contém algumas instruções SQL, e eu quero executá-las usando o 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 eval. 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 tenho alguns problemas com
\.
Não consigo substituir isso por algo e, em seguida, revertê-lo.
é onde eu estou agora. Se alguém puder me ajudar neste momento, será muito apropriado