日付などの変数を含むテキストファイルにいくつかの選択ステートメントを保存したいと思います。
$ 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
残念ながら、これらの変数はスクリプトでは使用されません。だから評価をしてみました。私はこれを持っています:
$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
(そして各文字の前にバックスラッシュを追加することはできません。) - 2つのレベルの引用符を使用していますが、これはおそらく望むものではありません。
- これを行うには、Bashよりも優れた言語を使用してください。すべての引用とエスケープビジネスが状況を複雑にするので、この種の仕事はひどいです。本物特別な状況を見逃すのは簡単です。 Python、Ruby、さらにはPHPもBashよりもこの種の操作をはるかによく処理します。