2012-01-10 13 views
0

awkを使って1つのレコードpsqlクエリの出力を処理してから、それをmy expectスクリプトの値に割り当てる必要があります。Awkでエスケープすることを期待する

関連するコード:

 
spawn $env(SHELL) 
send "psql -U safeuser -h db test -c \"SELECT foo((SELECT id FROM table where ((table.col1 = \'$user\' AND table.col2 IS NULL) OR table.col2 = \'$user\') AND is_active LIMIT 1));\" | /bin/awk {{NR=3}} {{ print $1 }}; \r" 
expect "assword for user safeuser:" 
send "$safeuserpw\r" 
expect -re '*' 
set userpass $expect_out(0, string) 

私はスクリプトを実行すると、私が手:

産卵/ binに/ bashの は "1" を読んでいないことができません:そのような変数 "送信" PSQLに"-u safeuser -h db test -c \" SELECT foo((SELECT id FROM table where(table.col1 = \ '$ user \'およびtable.col2 ...)」

私には何かがありますか?ここで行方不明ですか?私は、二重の中括弧がawkコードを保護している印象を受けましたブロック。

答えて

1

条件式で '=='の代わりに '='を使用しているため、awkスクリプトはすべての行を表示します。以下を試してください:

spawn $env(SHELL) 
send "psql -U safeuser -h db test -c \"SELECT foo((SELECT id FROM table where ((table.col1 = \'$user\' AND table.col2 IS NULL) OR table.col2 = \'$user\') AND is_active LIMIT 1));\" | /bin/awk \'NR==3 { print $1 }\'; \r" 
expect "assword for user safeuser:" 
send "$safeuserpw\r" 
expect -re '*' 
set userpass $expect_out(0, string) 
+0

SSHトンネルを介して同じコマンドを別のボックスにルーティングするという以前の試みからウサギの穴をあまりにも遠ざけてしまったため、戻って来ることができませんでした – Magellan

1

あなたの送信ラインは引用符で囲まれているため、tclによって評価されています。それを渡す必要がある場合は、awkの部分を$から変更する必要があります。

... |/bin/awk \ 'NR == 3 {print \ $ 1} \'; \ r "

+1

ありがとうございます。今すぐテストしてみてください。 – Magellan

関連する問題