如何使用 sed 或 grep 搜索模式之前的行

如何使用 sed 或 grep 搜索模式之前的行

我有一个日志文件ouput.log,日志文件的内容如下。日志文件由.sql按顺序输出的多个文件组成。日志文件将包含正在执行的 SQL 文件示例 -->@/opt/DBA/HIP/FILES/Environments/PRDO/347_WT_04NOV2020.sql它可以包含 'n' 个 sql 语句,从这些语句中可以使用 ORA- 模式在任何位置出错。因此,每当命令找到 ORA- 时,我都应该获取已出错的文件名。

== Files executed in PRDO ==

== PRDO Execution spool ==
SQL> @/opt/DBA/HIP/FILES/Environments/PRDO/347_WT_04NOV2020.sql
SQL> ------UHIPOPS-36625---
SQL>
SQL> SET DEFINE OFF;
SQL>
SQL> ALTER SESSION SET CURRENT_SCHEMA = HIS_PD;

Session altered.

Elapsed: 00:00:00.00
SQL>
SQL> INSERT INTO msg (MSG_ID,
  2                   LANG_CD,
  3                   SVR_CD,
  4                   MSG_DSC)
  5       VALUES (92012,
  6               'EN',
  7               1,
  8               'Please enter the EIN in the correct format: XX-XXXXXXX.');

1 row created.

Elapsed: 00:00:00.03
SQL>
SQL> INSERT INTO msg (MSG_ID,
  2                   LANG_CD,
  3                   SVR_CD,
  4                   MSG_DSC)
  5       VALUES (92012,
  6               'ES',
  7               1,
  8               'Ingrese el EIN en el formato correcto: XX-XXXXXXX.');

ORA-

Elapsed: 00:00:00.00
SQL>
SQL> INSERT INTO msg (MSG_ID,
  2                   LANG_CD,
  3                   SVR_CD,
  4                   MSG_DSC)
  5       VALUES (92012,
  6               'PT',
  7               1,
  8               'Introduza o EIN no formato correto: XX-XXXXXXX.');

1 row created.

Elapsed: 00:00:00.00
SQL>
SQL> COMMIT;

Commit complete.

Elapsed: 00:00:00.00

SQL> @/opt/DBA/HIP/FILES/Environments/PRDO/348_WT_04NOV2020.sql
SQL> ------UHIPOPS-36625---
SQL>
SQL> SET DEFINE OFF;
SQL>
SQL> ALTER SESSION SET CURRENT_SCHEMA = HIS_PD;

Session altered.

Elapsed: 00:00:00.00
SQL>
SQL> INSERT INTO msg (MSG_ID,
  2                   LANG_CD,
  3                   SVR_CD,
  4                   MSG_DSC)
  5       VALUES (92012,
  6               'EN',
  7               1,
  8               'Please enter the EIN in the correct format: XX-XXXXXXX.');

1 row created.

Elapsed: 00:00:00.03
SQL>
SQL> INSERT INTO msg (MSG_ID,
  2                   LANG_CD,
  3                   SVR_CD,
  4                   MSG_DSC)
  5       VALUES (92012,
  6               'ES',
  7               1,
  8               'Ingrese el EIN en el formato correcto: XX-XXXXXXX.');

1 row created.

Elapsed: 00:00:00.00
SQL>
SQL> INSERT INTO msg (MSG_ID,
  2                   LANG_CD,
  3                   SVR_CD,
  4                   MSG_DSC)
  5       VALUES (92012,
  6               'PT',
  7               1,
  8               'Introduza o EIN no formato correto: XX-XXXXXXX.');

ORA-

Elapsed: 00:00:00.00
SQL>
SQL> COMMIT;

Commit complete.

Elapsed: 00:00:00.00

对于上面日志文件中的示例,我执行了两个已捕获的 SQL 文件,并且两个文件都出现了错误ORA-。现在有没有命令或任何方式可以获取错误sql的文件名?输出应该如下所示

347_WT_04NOV2020.sql
348_WT_04NOV2020.sql

我所知道的是基本的,grep "ORA-" output.log如果在output.log中找到ORA-,它将给我一个输出

答案1

使用awk

awk -F'/' '/^SQL> @/{ filename=$NF; next } /^ORA-/{ print filename; }' infile

答案2

这是一个sed带有以下内容的版本xargs

sed -n '/^SQL> @/{s/^SQL> @//;h};/^ORA-/{g;p;}' output.log | xargs -L1 basename
  • -n抑制默认输出,因此仅显示具有显式打印命令的行
  • 第一个sed匹配仅获取路径和文件名并将其 ( h) 保存在缓冲区中
  • 第二个sed匹配获取缓冲区的内容 ( g) 并打印它 ( p)
  • xargs将每行输出发送到basename,它仅显示文件名部分

相关内容