Sed
如何使用 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-
. 現在有沒有命令或任何方法可以獲取錯誤 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
,它只顯示文件名部分