如何在Unix中使用grep获取完整的多行语句



--Oracle 11g
--Linux
我正在尝试创建丢失的对象,并希望从文件中所有对象的ddl中获取任何特定对象的ddl。我想使用grep获取一个对象的ddl,但create语句被分解为多行,并且通过grep只获取一行。如何使用grep或任何其他方法获取完整的create语句?

比方说,下面是一个包含许多针对所有对象的create语句的文件,我只想为缺少的对象获取create语句,所以我从ddl_file中grep了缺少的object_name。

包含所有create_statement dll的文件:create_statement_ddl.txt

cat create_statement_ddl.txt
CREATE OR REPLACE TRIGGER pt_set_session_tz 
AFTER LOGON ON SCHEMA 
DECLARE 
v_tz  VARCHAR2(100); 
v_no_data BOOLEAN:=FALSE; 
BEGIN 
v_tz:=pkg_tool.get_db_timezone; 
IF (v_tz IS NOT NULL) THEN    
EXECUTE IMMEDIATE 'ALTER SESSION SET TIME_ZONE=' || ''''||v_tz||''''; 
END IF; 
END; 
/

create or replace trigger PT_AI_CMPL_STAT after INSERT on PA_CMPL_STAT for each row 
begin 
INSERT /*+ B1805_DDL */ INTO PH_CMPL_STAT 
(CMPL_STAT_ID, 
CPNT_TYP_ID, 
CMPL_STAT_DESC, 
PROVIDE_CRDT, 
TAP_DEF_ID, 
REQUIRE_ESIG, 
LST_UPD_USR, 
LST_UPD_TSTMP, 
ACTION 
) 
VALUES 
(:new.CMPL_STAT_ID, 
:new.CPNT_TYP_ID, 
:new.CMPL_STAT_DESC, 
:new.PROVIDE_CRDT, 
:new.TAP_DEF_ID, 
:new.REQUIRE_ESIG, 
:new.LST_UPD_USR, 
:new.LST_UPD_TSTMP, 
'I' 
); 
end; 
/

create or replace trigger PT_AU_CMPL_STAT after UPDATE on PA_CMPL_STAT for each row 
begin 
INSERT /*+ B1805_DDL */ INTO PH_CMPL_STAT 
(CMPL_STAT_ID, 
CPNT_TYP_ID, 
CMPL_STAT_DESC, 
PROVIDE_CRDT, 
TAP_DEF_ID, 
REQUIRE_ESIG, 
LST_UPD_USR, 
LST_UPD_TSTMP, 
ACTION 
) 
VALUES 
(:new.CMPL_STAT_ID, 
:new.CPNT_TYP_ID, 
:new.CMPL_STAT_DESC, 
:new.PROVIDE_CRDT, 
:new.TAP_DEF_ID, 
:new.REQUIRE_ESIG, 
:new.LST_UPD_USR, 
:new.LST_UPD_TSTMP, 
'M' 
); 
end; 
/
grep missing_object_name `cat create_statement_ddl.txt` > create_object.sql
grep pt_set_session_tz `cat create_statement_ddl.txt` > create_object.sql

我得到的是

CREATE OR REPLACE TRIGGER pt_set_session_tz

我想要的是:

CREATE OR REPLACE TRIGGER pt_set_session_tz 
AFTER LOGON ON SCHEMA 
DECLARE 
v_tz  VARCHAR2(100); 
v_no_data BOOLEAN:=FALSE; 
BEGIN 
v_tz:=pkg_tool.get_db_timezone; 
IF (v_tz IS NOT NULL) THEN    
EXECUTE IMMEDIATE 'ALTER SESSION SET TIME_ZONE=' || ''''||v_tz||''''; 
END IF; 
END; 
/

grep用于在单行中查找regexp并打印结果,这是错误的工具。如果我正确理解你,那么用awk,它只会是:

awk '/pt_set_session_tz/{f=1} f; /^//{f=0}' create_statement_ddl.txt

相关内容

  • 没有找到相关文章

最新更新