Quiero almacenar en un archivo de texto alguna declaración de selección que contenga variables como una fecha:
$ cat res.txt
select field1, field2 from log and log_time~'"${TODAY}"*'
Quiero usar un script que analice este archivo y, para cada declaración, lo ejecute. Por supuesto, ${TODAY}
será reemplazado por una variable.
Desafortunadamente, ${TODAY}
nunca se reemplaza por una fecha en la que leí el archivo...
¿Hay una manera de lograr esto?
ACTUALIZAR:
Digamos que quiero iterar a través de un archivo que contiene algunas declaraciones SQL y quiero ejecutarlas usando psql (postgres).
Aquí está el archivo:
$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$';
Ahora en un script bash, quiero:
$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
Lamentablemente, las variables no se utilizan en el script. Entonces probé eval. Tengo así:
$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
Pero tengo algunos problemas con
\.
Respuesta1
Simplemente puedes reemplazar la cadena de la variable con el valor:
sed -e "s/\${TODAY}/$TODAY/g" res.txt
Pero:
- Asegúrese absolutamente de haber ejecutado la variable a través de una API confiable (como creada por la base de datos proporcionada o parte de una API de lenguaje de programación popular).noalgo casero)mecanismo de escape.
- También tendrás que escapar de cualquier personaje.específico a
sed
(y no puedes simplemente agregar barras invertidas antes de cada carácter). - Estás utilizando dos niveles de comillas, algo que probablemente no era tu intención.
- Utilice un lenguaje mejor que Bash para esto. Es horrendo para este tipo de cosas, porque todas las citas y evasiones que complican y hacenen realidadEs fácil pasar por alto casos especiales. Python, Ruby e incluso PHP manejan este tipo de cosas mucho mejor que Bash.