Substitua a variável lida de um arquivo de texto (para que possam ser interpretados)

4

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

    
por Romain Pelissier 28.03.2012 / 17:18

1 resposta

3

Você pode simplesmente substituir a string variável pelo valor:

sed -e "s/\${TODAY}/$TODAY/g" res.txt

Mas :

  • Tenha absoluta certeza de que você executou a variável através de um confiável (como em, criado pelo DB fornecido ou parte de uma API de linguagem de programação popular, não algo homebrewed) mecanismo de escape .
  • Você também terá que escapar de quaisquer caracteres específicos para sed (e você não pode simplesmente adicionar barras invertidas antes de cada caractere).
  • Você está usando dois níveis de citações, o que provavelmente não pretendeu.
  • Por favor, use um idioma melhor que o Bash para isso. É horrível para este tipo de coisa, porque todo o negócio de citações e fugas que complica e torna muito fácil de perder casos especiais. Python, Ruby e até PHP lidam com esse tipo de coisa muito melhor do que o Bash.
por 28.03.2012 / 17:33