Como extrair uma consulta de cada vez de um arquivo SQL?

0

Estou tentando extrair uma consulta por vez de um arquivo SQL.

Isso é o que eu tentei

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

Meu arquivo SQL tem esta aparência:

sqlFile.sql

selecione * do teste1;

selecione * do test2;

selecione * do teste3;

Estou obtendo isso como resultado:

wedtorque@wedtorque-VirtualBox:~/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;
wedtorque@wedtorque-VirtualBox:~/Desktop$

Considerando que eu esperava algo assim:

wedtorque@wedtorque-VirtualBox:~/Desktop$ ./masterFile.sh
select *from test1;
select *from test1;
select *from test1;
wedtorque@wedtorque-VirtualBox:~/Desktop$

Além disso, quando faço eco do $char dentro de loop while, ele imprime os nomes dos arquivos sempre que $char obtém o * das consultas, select *from test1 ; etc

Algo parecido com isto

wedtorque@wedtorque-VirtualBox:~/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;
;
    
por deepak pandey 20.04.2017 / 23:03

1 resposta

0

Não tem 100% de certeza do que você está fazendo, mas adivinho. Por favor, informe se isso está errado.

O arquivo .sql, no meu caso de teste, chamarei test.sql :

select * from test1;
select * from test2;
select * from test3;

E o script para ler e ecoar os dados sql:

#!/bin/sh

# Get the raw sql data
RAW='cat test.sql'

# We want to split the raw sql on a line return.
IFS="
"

# Echo out each line? Not sure if this is what you want.
for sql in $RAW
do
    echo "SQL line: [${sql}]"
done

exit

Isso fornecerá o seguinte resultado:

SQL line: [select * from test1;]
SQL line: [select * from test2;]
SQL line: [select * from test3;]

Acho que o pouco que você está perdendo é a parte IFS . De man sh :

IFS  Input Field Separators. This is normally set to ⟨space⟩, 
     ⟨tab⟩, and ⟨newline⟩.
    
por 21.04.2017 / 09:35

Tags