我想读取一个文件到EOF,它有多个用管道或双管道分隔的sql查询。选择管道因为选项卡,\ n和空格可能已存在于查询中。查询可以跨越多行。每个查询都需要读入变量并在while循环中,我想使用该querystring变量在DB上运行命令/ SQL查询。循环必须对从文件创建的所有查询字符串执行此操作。
示例文件内容:
select * from blah;||select column from table1;||select column7 from table4;EOF
到目前为止,这是我的脚本:
while IFS=$'||' read -r querystring
do
run some shell command on ${querystring}
done < myqueryfile.sql
到目前为止,这是多少。想法/评论赞赏
答案 0 :(得分:1)
如果sql文件包含一些多行的句子,如:
select *
from blah;||
select column
from table1;||
select column7
from table4;
您可以使用gawk / awk将句子块与其他行中的分隔管隔离。这产生了易于处理的输出:
gawk -v RS="[|][|]" -v ORS="\n||\n" '{ print $0}' file | while read -r line
do
if [ "$line" == "||" ]; then
run some shell command on "$sentence"
sentence=""
else
sentence=$sentence"\n"$line
fi
done
不需要临时文件; - )
答案 1 :(得分:0)
你可以使用awk:
/tmp ❯❯❯ cat /tmp/a ⏎
select * from blah;||select column from table1;||select column7 from table4
/tmp ❯❯❯ awk 'BEGIN {FS="[|][|]"} {for(i=1;i<=NF;i++)printf "run some shell command on %s\n",$i}' /tmp/a
run some shell command on select * from blah;
run some shell command on select column from table1;
run some shell command on select column7 from table4
/tmp ❯❯❯ awk 'BEGIN {FS="[|][|]"} {for(i=1;i<=NF;i++)printf "run some shell command on %s\n",$i}' /tmp/a |sh -