Sed

如何使用 sed 或 grep 在模式前搜尋一行

  • November 11, 2020

我有一個日誌文件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-. 現在有沒有命令或任何方法可以獲取錯誤 sqls 的文件名?輸出應如下所示

347_WT_04NOV2020.sql
348_WT_04NOV2020.sql

我所知道的都是基本grep "ORA-" output.log的,如果在 output.log 中找到 ORA-,它將給我一個輸出

使用awk

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

這是一個sed版本xargs

sed -n '/^SQL> @/{s/^SQL> @//;h};/^ORA-/{g;p;}' output.log | xargs -L1 basename
  • -n禁止預設輸出,因此只顯示帶有顯式列印命令的行
  • 第一個sed匹配只取路徑和文件名並將其保存h在緩衝區中 ( )
  • 第二個sed匹配獲取緩衝區的內容 ( g) 並列印它 ( p)
  • xargs將每一行輸出發送到basename,它只顯示文件名部分

引用自:https://unix.stackexchange.com/questions/619102