- PR -

シェルスクリプト expectのログ出力について

投稿者投稿内容
いっさ
ベテラン
会議室デビュー日: 2005/04/18
投稿数: 83
投稿日時: 2007-11-27 12:45
expectを使ってpostgresSQLに入って
ファイルを読込み、インサートするシェルを作ったのですが、
そのインサートした結果のログを出力させるよう、
インサートの後に
"log_file log"を書いたら
その追加するコマンドまで吐き出されてしまいます…
必要なのは結果だけなのですが、
コマンドをカットして結果だけ出力するやり方はあるのでしょうか?

力を貸して頂けたらと思い書き込みました。
お願い致します。
Ray
ベテラン
会議室デビュー日: 2007/09/13
投稿数: 88
投稿日時: 2007-11-27 14:25

>その追加するコマンドまで吐き出されてしまいます…

追加するコマンドとは、SQLのことを言っているのでしょうか。
postgresSQLに入ってというのはpsqlのシェルを使っているということでいいのでしょうか。(spawn psql)
ログが取られるのは出力に吐かれるものだと思うので、psqlの問題だと思うのですが。

こんなのはどうでしょう。
$ cat insert.sql
insert into test values(1,'a');
insert into test values(2,'b');
$ psql -f insert.sql db
INSERT 0 1
INSERT 0 1
いっさ
ベテラン
会議室デビュー日: 2005/04/18
投稿数: 83
投稿日時: 2007-11-27 18:26
RaYさんありがとうございます。

>>追加するコマンドとは、SQLのことを言っているのでしょうか。
>>postgresSQLに入ってというのはpsqlのシェルを使っているということでいいのでしょうか。(spawn psql)
そうです。

log_file log
は記述した以降の処理を全て出力されてしまい(画面上の)、
余計なところを端折りたいのです。

copy.sh
---------------------
#!/bin/sh||

expect -c "

spawn psql -U postgres -d test

expect "#"

send \"COPY usertest FROM '/home/postgres/tmp/data.csv' CSV;\\r\"

log_file log

expect close
"
----------------------

がシェルの中身です。
Ray
ベテラン
会議室デビュー日: 2007/09/13
投稿数: 88
投稿日時: 2007-11-27 19:16
cat data.csv|psql -c "COPY test FROM STDIN;"
これで十分だと思います。psqlにはSQLをコマンドとして実行できる-cオプションがあるので。

それとも一部だけ載せていて、他にもいろいろとあるのでしょうか。
一応expectで一部だけ記録しない方法はありますが、一つのsendの中の一部だけ記録というならこれでは無理ですね。grepかtclで消せばいいんですかね。
コード:
#!/usr/bin/expect --

set timeout 30
log_file log
spawn telnet file.lan
expect "login:"
send "test\r"
expect "Password:"
stty -echo
log_file
expect_user -re "(.*)\n"
stty echo
log_file log
send_log "*************\r"
send "$expect_out(1,string)\r"
interact

いっさ
ベテラン
会議室デビュー日: 2005/04/18
投稿数: 83
投稿日時: 2007-11-27 19:26
ありがとうございます。

一部だけではなく、全部です。
あれを実行すると、

test=# COPY usertest FROM '/home/postgres/tmp/data.csv' CSV;
COPY 1

という結果がログとして出力されます。
この、「COPY 1」だけを出したいと思っています。
Ray
ベテラン
会議室デビュー日: 2007/09/13
投稿数: 88
投稿日時: 2007-11-27 20:34
やはりexpectにする理由がわかりません。
こんなsh-scriptでいいような。
$ psql -c ”COPY usertest FROM '/home/postgres/tmp/data.csv' CSV;" -U postgres -d test > log

私の環境では数値が出ませんでしたけど。
test=# copy test from '/home/test/sql/data.csv' CSV;
COPY

$ psql --version
psql (PostgreSQL) 8.1.9
contains support for command-line editing

VERSION = 'PostgreSQL 8.1.9 on i486-pc-linux-gnu, compiled by GCC cc (GCC) 4.1.2 20061115 (prerelease) (Debian 4.1.1-21)'
いっさ
ベテラン
会議室デビュー日: 2005/04/18
投稿数: 83
投稿日時: 2007-11-28 09:30
でわ、自分のようなやり方では、
出したいログだけは出力できないという事でしょうか?

流れでは、
WEB上のアップロードボタンを押して
CSV形式のファイルがアップされる処理で
その中でこのシェルを使いたいと思っていました。
いっさ
ベテラン
会議室デビュー日: 2005/04/18
投稿数: 83
投稿日時: 2007-11-28 16:52
もう自分のやり方ではできないという事ですかね…?

どなたかいい方法知っているっていう方は
お願い致しますm(_ _)m

スキルアップ/キャリアアップ(JOB@IT)