如何从SQL文件中一次提取一个查询?

如何从SQL文件中一次提取一个查询?,sql,bash,unix,awk,substr,Sql,Bash,Unix,Awk,Substr,我试图从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文件中一次提取一个查询

这就是我尝试过的

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
而我却期待着这样的事情:

wedtorque@wedtorque-VirtualBox:~/Desktop$ ./masterFile.sh
select *from test1;
select *from test1;
select *from test1;
wedtorque@wedtorque-VirtualBox:~/Desktop$
另外,当我在while循环中回显$char时,每当$char从查询中获得*时,它就会打印文件名,从test1中选择*;等

像这样的

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;
; 
same thing 3 times 

在我看来,awk有问题吗?

您需要做的只是逐行读取文件,这可以在没有awk的情况下以更简单的方式完成:

while IFS= read -r line; do
  echo "$line" # Or do what you need to do (e.g. execute SQL statement)
done <sql1Temp.sql
基本上,创建一个包含失败语句的新文件,然后移动新文件以覆盖旧文件,除非新文件不存在

请注意!在里面AsHysQLLUntudio $行意味着认为这个命令的失败意味着测试本质上是一个非逻辑操作符。

此外,我在上面的代码中使用了echo,使其尽可能熟悉,但是使用printf可以确保没有特殊的字符序列触发意外的shell行为。将上面的行替换为以下内容:

printf "%s" "$line" >>"$failed"
最后,您可以使用逻辑运算符而不是if块进一步缩短代码:


我还包括了shebang,以允许该脚本作为可执行文件启动。使用逻辑| | OR运算符并不比使用if语句更好,只有在您理解并更喜欢它的情况下才能这样做。

请您解释一下您的脚本的用途,就像我读它的方式一样,它看起来像是一种相当于cat sql1Temp.sql的复杂而缓慢的方式,我想一定是我遗漏了什么。我需要从sql1Temp.sql文件中获取一个sql查询,执行它,然后将该查询复制到一个新文件,并从原始文件中删除该查询。每行是否始终有一个sql语句,或者,您是否需要处理可以用分号分隔多个字符的情况?我需要用;分隔。我的sql文件包含多行查询,以分号结尾。下一个查询以新行开始您应该将其作为单独的问题发布。如何从sql1Temp.sql中删除$linesingle query。将其复制到新文件后,您是否希望sql1Temp.sql在完成处理后为空,或者根据某些条件,某些行仍保留在文件中?sql1Temp.sql将具有执行失败的剩余sql查询
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"
printf "%s" "$line" >>"$failed"
#!/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"