我有一个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'