Linux,Grep转换为不带字符的数学字符串

时间:2018-06-20 08:57:33

标签: regex linux grep

我正在尝试安装LOG4PLSQL。 linux服务器上有一个构建过程,该过程将日志放入文件中。

处理完所有文件后,有一个命令可以检查文本文件是否包含 ORA-字符串,

问题是,在log4plsql中,代码实际上包含一个 ORA-

BEGIN
build   20-Jun-2018 09:22:28    1960       checkAndInitCTX(pCTX);
build   20-Jun-2018 09:22:28    1961       LLTEXT :=   'SQLCODE:'||SQLCODE ||' SQLERRM:'||SQLERRM || CHR(10) ||
build   20-Jun-2018 09:22:28    1962            'Error back trace:' || CHR(10) ||
build   20-Jun-2018 09:22:28    1963             replace(dbms_utility.format_error_backtrace, 'ORA-06512: ', ''); -- <<<<<<<<<<
build   20-Jun-2018 09:22:28    1964       log(pLEVEL => PLOGPARAM.DEFAULT_FT_ERR_BTRACE_LEVEL, pCTX => pCTX,  pTEXT => LLTEXT );
build   20-Jun-2018 09:22:28    1965  END full_error_backtrace;
build   20-Jun-2018 09:22:28    1966  
build   20-Jun-2018 09:22:28    1967  
build   20-Jun-2018 09:22:28    1968  FUNCTION getLOG4PLSQVersion
build   20-Jun-2018 09:22:28    1969  RETURN VARCHAR2

尽管构建没有错误,但此grep函数在程序包代码中找到一个并将其视为错误。

负责查找ORA的Grep:grep "ORA-" 我将其修改为:grep "[^']ORA-"

和带有'('ORA-)的ORA-现在是不可见的,但是不可见也是实际的错误:

ORA-00955: name is already being used by existing object

例如,在此日志中:

BEGIN
       checkAndInitCTX(pCTX);
       LLTEXT :=   'SQLCODE:'||SQLCODE ||' SQLERRM:'||SQLERRM || CHR(10) ||
            'Error back trace:' || CHR(10) ||
             replace(dbms_utility.format_error_backtrace, 'ORA-06512: ', '');
       log(pLEVEL => PLOGPARAM.DEFAULT_FT_ERR_BTRACE_LEVEL, pCTX => pCTX,  pTEXT => LLTEXT );
END full_error_backtrace;
ORA-00955: name is already being used by existing object

我的grep找不到任何ORA。

有人有主意吗?

2 个答案:

答案 0 :(得分:1)

问题是,当您将[^']添加到正则表达式grep时,期望在ORA-的左侧有一个字符,但是-因为该模式可能在开头如果发生真正错误,则该行中的行-可能无法找到行(如上面示例中所做的那样)。

某些正则表达式大师可能有一个更优雅的解决方案,但以下对我有用:

grep -E "(^|[^'])ORA-" output.log

这将匹配开始ORA- 的行,其中包含模式ORA-并以除{{1之外的任何字符}}

我的'版本:

grep

答案 1 :(得分:0)

尝试将-P用于与perl兼容的正则表达式

grep -P“ ^ ORA- | \'ORA”日志