2017-04-21 67 views
1

我想從SQL文件中一次提取一個查詢。如何從SQL文件中一次提取一個查詢?

這是我曾嘗試

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
SELECT * FROM test1的;
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$ 

還當我贊同while循環中的$字符,它打印文件名每次$ char從查詢中獲得*,從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?

+0

請問你能解釋一下你的腳本是用來做什麼的,就像我閱讀它的方式一樣,它看起來像是一個相當於'cat sql1Temp.sql'的複雜和緩慢的方式,我想我必須有一些東西失蹤。 – Fred

+0

我需要從sql1Temp.sql文件中獲取一個sql querry執行它然後將此querry複製到一個新文件並從原始文件中刪除該querry。 –

+0

每行是否總是有單個SQL語句,或者您是否需要處理可以有多個(用分號隔開)的情況? – Fred

回答

1

你需要做的很簡單,就是逐行讀取一個文件中的行,可以在不awk並以更簡單的方式來完成:

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

您不必擔心分號,因爲read語句將一次讀取一行,並且每行讀取一條語句。

如果你想要做刪除執行成功執行的語句,你可以做這樣的事情:

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"中的!表示「認爲此命令失敗,意味着測試成功」(本質上是非邏輯運算符)。

此外,我在上面的代碼中使用了echo以使其儘可能熟悉,但是使用printf來代替確保沒有特殊的字符序列觸發意外的shell行爲。替換上面的行:

#!/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中刪除$行(單個查詢)。在將其複製到一個新文件後 –

+0

當您完成處理時,您是否期望'sql1Temp.sql'爲空,或者根據某些條件將某些行保留在文件中? – Fred

相關問題