Я хочу сохранить в текстовом файле некоторые операторы select, содержащие переменные, например дату:
$ cat res.txt
select field1, field2 from log and log_time~'"${TODAY}"*'
Я хочу использовать скрипт, который будет анализировать этот файл и для каждого оператора выполнять его. Конечно, ${TODAY}
будет заменено переменной.
К сожалению, ${TODAY}
никогда не заменяется датой прочтения файла...
Есть ли способ этого добиться?
ОБНОВЛЯТЬ:
Допустим, я хочу выполнить итерацию по файлу, содержащему некоторые SQL-операторы, и выполнить их с помощью psql (postgres).
Вот файл:
$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$';
Теперь в скрипте bash я хочу:
$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
К сожалению, переменные не используются в скрипте. Поэтому я попробовал eval. У меня получилось так:
$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
Но у меня есть некоторые проблемы с
\.
решение1
Вы можете просто заменить переменную строку значением:
sed -e "s/\${TODAY}/$TODAY/g" res.txt
Но:
- Будьте абсолютно уверены, что вы пропустили переменную через надежный (например, созданный предоставленной базой данных или частью API популярного языка программирования,нетчто-то домашнее)механизм эвакуации.
- Вам также придется избегать любых персонажей.конкретных для
sed
(и вы не можете просто добавить обратную косую черту перед каждым символом). - Вы используете два уровня кавычек, хотя, вероятно, не хотели этого делать.
- Пожалуйста, используйте для этого язык получше, чем Bash. Это ужасно для такого рода вещей, потому что все эти цитирования и экранирования, которые усложняют и делают этоДействительноЛегко упустить особые случаи. Python, Ruby и даже PHP справляются с такими вещами гораздо лучше, чем Bash.