在shell / bash中读取文件到EOF的while循环管道分离 - shell脚本

时间:2016-08-12 06:07:22

标签: bash shell while-loop

我想读取一个文件到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

到目前为止,这是多少。想法/评论赞赏

2 个答案:

答案 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 -