![如何使用 sed 或 grep 搜索模式之前的行](https://linux22.com/image/183253/%E5%A6%82%E4%BD%95%E4%BD%BF%E7%94%A8%20sed%20%E6%88%96%20grep%20%E6%90%9C%E7%B4%A2%E6%A8%A1%E5%BC%8F%E4%B9%8B%E5%89%8D%E7%9A%84%E8%A1%8C.png)
我有一个日志文件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
,它仅显示文件名部分