sed 또는 grep을 사용하여 패턴 앞의 줄을 검색하는 방법

sed 또는 grep을 사용하여 패턴 앞의 줄을 검색하는 방법

로그 파일이 있는데 ouput.log로그 파일의 내용은 다음과 같습니다. 로그 파일은 .sql여러 파일 출력을 순서대로 구성합니다. 로그 파일에는 실행 중인 SQL 파일의 예가 포함됩니다. --> @/opt/DBA/HIP/FILES/Environments/PRDO/347_WT_04NOV2020.sqlORA 모드를 사용하는 어느 지점에서나 오류가 발생할 수 있는 'n'개의 SQL 문이 포함될 수 있습니다. 따라서 명령이 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.logORA-가 output.log에 있으면 출력이 제공됩니다.

답변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파일 이름 부분만 표시됩니다.

관련 정보