使用shell脚本从脚本中选择所需的sql



我有一个sybase ddl文件,它有许多表的ddl。。但是问题是wth-ddl还有很多其他的东西和不必要的索引创建脚本和注释。有没有办法从这个文件中只提取ddl。下面是一个文件的小样本。

-------------------------------------------
-- DDL fpr table 'prod.dbo.tbl1'
--------------------------------------------
print '<<<< creating table prod.dbo.tbl1
go
setuser 'dbo'
go
create table tbl1 (id numeric (10,0),
etity     CHAR(2))
-------------------------------------------
-- DDL fpr table 'prod.dbo.tbl2'
--------------------------------------------
print '<<<< creating table prod.dbo.tbl1
go
setuser 'dbo'
go
create table tbl2 (id numeric (10,0),
etity     CHAR(2))
---------------------------------------------------

从这个文件中,我只想要创建表ddl。有什么方法可以实现吗..输出应该只有下面这样的DDL。。

create table tbl1 id numeric (10,0),
etity     CHAR(2);
create table tbl2 id numeric (10,0),
etity     CHAR(2);

假设:

  • 只对create table命令感兴趣(即,对其他与表相关的DDL不感兴趣,如create index、RI/检查约束、默认/规则绑定、缓存配置、grant/revoke等(
  • create table块通过空行(无空格(、go(从第1列开始(或注释块(--从第1行开始(终止

样本输入文件:

$ cat ddl.sql
-------------------------------------------
-- DDL fpr table 'prod.dbo.tbl1'
--------------------------------------------
print '<<<< creating table prod.dbo.tbl1
go
setuser 'dbo'
go
create table tbl1 (id numeric (10,0),
etity     CHAR(2))
-------------------------------------------
-- DDL fpr table 'prod.dbo.tbl2'
--------------------------------------------
print '<<<< creating table prod.dbo.tbl1
go
setuser 'dbo'
go
create table tbl2 (id numeric (10,0),
etity     CHAR(2))
---------------------------------------------------
create table tbl3 (id numeric (10,0),
etity     CHAR(2))
go
---------------------------------------------------

一个awk解决方案:

awk '
/create table/         { printme=1 }     # set our "print" flag when we see "create table"
/^$/ || /^go/ || /^--/ { if (printme)    # if in midst of printing "create table" then 
print ";"    # print ending ";" and then
printme=0       # clear "print" flag
}
printme' ddl.sql                         # if "print" flag is set (ie, "=1") then print current line

或者作为删除注释的一行:

awk '/create table/ {printme=1} /^$/ || /^go/ || /^--/ { if (printme) print ";";printme=0} printme' ddl.sql

对我的ddl.sql运行以上操作生成:

create table tbl1 (id numeric (10,0),
etity     CHAR(2))
;
create table tbl2 (id numeric (10,0),
etity     CHAR(2))
;
create table tbl3 (id numeric (10,0),
etity     CHAR(2))
;

注意:如果OP需要行末尾的;,则可以向awk解决方案添加更多代码。。。

如果所有不需要的行都以以下字符开头:--、print、go、setuser。。。

你可以做:

cat DDL.txt | egrep -v '^--|^print|^go|^setuser'

相关内容

  • 没有找到相关文章

最新更新