2017-04-21 10 views
1

SQLファイルから一度に1つのクエリを抽出しようとしています。SQLファイルから一度に1つのクエリを抽出する方法はありますか?

これは私が

index1=1 
index2=1 
while read -n1 char; do 
if [[ $char == ";" ]] 
    then 
    SUBSTRING=$(awk 'substr($index1,$index2)' sql1Temp.sql) 
    echo $SUBSTRING 
    index1=$index2 
fi 
((index2+=1)) 

done <sql1Temp.sql 

を試してみましたが、何を、このような私のSQLファイルを見ている:

sql1Temp.sql
がtest1のSELECT * FROM。
select * from test2;
select * from test3;

私は、結果としてこれを取得しています:私はこのような何かを期待していたのに対し

[email protected]:~/Desktop$ ./masterFile.sh 
select *from test1; select *from test2; select *from test3; 
select *from test1; select *from test2; select *from test3; 
select *from test1; select *from test2; select *from test3; 
[email protected]:~/Desktop$ 

:私はしばらくの間、ループ内の$文字をエコーするとき

[email protected]:~/Desktop$ ./masterFile.sh 
select *from test1; 
select *from test1; 
select *from test1; 
[email protected]:~/Desktop$ 

をまた、それが印刷さ$ charが* fromクエリを取得するたびにファイル名、select * from test1;私の意見では、この

[email protected]:~/Desktop$ ./masterFile.sh 
s 
e 
l 
e 
c 
t 

masterFile.sh sql1result.sql sql1.sql sql1Temp.sql sql2.sql Untitled Document 
f 
r 
o 
m 

t 
e 
s 
t 
1 
select *from test1; select *from test2; select *from test3; 
; 
same thing 3 times 

などのなど

何かが何かがawkのが間違っていますか?

while IFS= read -r line; do 
    echo "$line" # Or do what you need to do (e.g. execute SQL statement) 
done <sql1Temp.sql 

あなたはセミコロンを心配する必要はありません。あなたがする必要がどのような

+0

私はそれを読む方法として、あなたのスクリプトが意図していることを説明してください、それは 'cat sql1Temp.sql'と同等の畳み込まれた、遅い方法のようであり、私は何かでなければならないと思います行方不明 – Fred

+0

sql1Temp.sqlファイルから1つのsql querryをフェッチして実行する必要があります。次に、このファイルを新しいファイルにコピーし、そのファイルを元のファイルから削除します。 –

+0

1行に1つのSQL文が常に存在するのですか、複数の(セミコロンで区切られた)複数のSQL文を扱う必要がありますか? – Fred

答えて

1

awkなしとはるかに簡単な方法で行うことができます行毎にファイルを読み込むことが単純ですreadステートメントは一度に1行ずつ読み込まれ、読み取る行ごとに1つのステートメントが存在するためです。

あなたは正常に実行を削除しない場合のステートメントを実行し、あなたはこのような何かすることができます、基本的に

local statements="sql1Temp.sql" 
local failed="sql1Temp.sql.failed" 
while IFS= read -r line; do 
    if 
    ! SOME_SQL_UTILITY "$line" 
    then 
    echo "$line" >>"$failed" 
    fi 
done <"$statements" 
[[ ! -f "$failed" ]] || mv -f "$failed" "$statements" 

に失敗した文を含む新しいファイルを作成し、しない限り、古いものを上書きする新しいファイルを移動新しいファイルは存在しません。

! SOME_SQL_UTILITY "$line"!は、「テストが成功したことを意味するこのコマンドの失敗を検討する」ことを意味します(本質的にNOT論理演算子)。

また、上記のコードではechoを使用していますが、代わりにprintfを使用すると、予期しないシェルの動作を引き起こす特殊文字シーケンスがないことを確認します。私も「シェバングを」が含まれている

#!/bin/bash 
local statements="sql1Temp.sql" 
local failed="sql1Temp.sql.failed" 
while IFS= read -r line; do 
    SOME_SQL_UTILITY "$line" || printf "%s" "$line" >>"$failed" 
done <"$statements" 
[[ ! -f "$failed" ]] || mv -f "$failed" "$statements" 

printf "%s" "$line" >>"$failed" 

最後に、あなたが代わりにifブロックの論理演算子を使って、ビットさらにコードを短縮できます。これに上記の行を置き換えこのスクリプトを実行可能ファイルとして起動することができます。論理||(OR)演算子を使用すると、ifステートメントを使用するよりも優れています。それをよく理解していれば、より良いことがわかった場合にのみ実行してください。

+0

別の質問として投稿してください。 – Fred

+0

どのようにsql1Temp.sqlから$行(単一のquerry)を削除できますか?新しいファイルにコピーした後 –

+0

'sql1Temp.sql'は処理を終了すると空になると思っていますか、あるいは何らかの条件によっては行のいくつかがファイルに残りますか? – Fred

関連する問題