【问题标题】:How to fetch entire multi line Statement using grep in Unix如何在 Unix 中使用 grep 获取整个多行语句
【发布时间】:2019-01-05 07:22:13
【问题描述】:

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

比方说,下面是包含所有对象的许多创建语句的文件,我只想获取丢失对象的创建语句,所以我从 ddl_file grep missing 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; 
/

【问题讨论】:

标签: linux awk oracle11g scripting grep


【解决方案1】:

grep 用于在单个行上查找正则表达式并打印结果,它是错误的工具。如果我理解正确,那么使用 awk 就是:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-06-03
    • 1970-01-01
    • 2015-04-07
    • 2013-07-30
    • 2015-09-28
    • 2020-06-21
    相关资源
    最近更新 更多