패턴이 일치하면 행을 삭제해야 합니다.

패턴이 일치하면 행을 삭제해야 합니다.

aa.textLinux 시스템에 다음 줄이 포함된 파일이 있습니다 .

$ cat aa.text
I am a user
ORA-1653: unable to extend table SYS.AUD$ by 128 in tablespace SYSTEM [PCRMR2S]
Fri Feb 09 23:57:51 2024
ORA-1653: unable to extend table SYS.AUD$ by 128 in tablespace SYSTEM [ABCD]
ORA-1653: unable to extend table SYS.AUD$ by 128 in tablespace SYSTEM [ABCD]
Fri Feb 09 23:57:51 2024
ORA-1653: unable to extend table SYS.AUD$ by 128 in tablespace SYSTEM [ABCD]
ORA-1653: unable to extend table SYS.AUD$ by 128 in tablespace SYSTEM [ABCD]
Fri Feb 09 23:57:51 2024
ORA-1653: unable to extend table SYS.AUD$ by 128 in tablespace SYSTEM [ABCD]
ORA-1653: unable to extend table SYS.AUD$ by 128 in tablespace SYSTEM [ABCD]
Fri Feb 09 23:57:51 2024
ORA-1653: unable to extend table SYS.AUD$ by 128 in tablespace SYSTEM [ABCD]
ORA-1653: unable to extend table SYS.AUD$ by 128 in tablespace SYSTEM [ABCD]
Fri Feb 09 23:57:52 2024
ORA-1653: unable to extend table SYS.AUD$ by 128 in tablespace SYSTEM [ABCD]
ORA-1653: unable to extend table SYS.AUD$ by 128 in tablespace SYSTEM [ABCD]
Fri Feb 09 23:57:54 2024
ORA-1653: unable to extend table SYS.AUD$ by 128 in tablespace SYSTEM [ABCD]
Fri Feb 09 23:57:54 2024
ORA-1653: unable to extend table SYS.AUD$ by 128 in tablespace SYSTEM [ABCD]
ORA-1653: unable to extend table SYS.AUD$ by 128 in tablespace SYSTEM [ABCD]
Fri Feb 09 23:57:55 2024
ORA-1653: unable to extend table SYS.AUD$ by 128 in tablespace SYSTEM [ABCD]
Fri Feb 09 23:57:56 2024
ORA-1653: unable to extend table SYS.AUD$ by 128 in tablespace SYSTEM [ABCD]
Fri Feb 09 23:57:56 2024
ORA-1653: unable to extend table SYS.AUD$ by 128 in tablespace SYSTEM [ABCD]
ORA-1653: unable to extend table SYS.AUD$ by 128 in tablespace SYSTEM [ABCD]
Fri Feb 09 23:57:56 2024
ORA-1653: unable to extend table SYS.AUD$ by 128 in tablespace SYSTEM [ABCD]
Fri Feb 09 23:57:56 2024
ORA-1653: unable to extend table SYS.AUD$ by 128 in tablespace SYSTEM [ABCD]
ORA-1653: unable to extend table SYS.AUD$ by 128 in tablespace SYSTEM [ABCD]
ORA-1653: unable to extend table SYS.AUD$ by 128 in tablespace SYSTEM [ABCD]
Fri Feb 09 23:58:03 2024
ORA-1653: unable to extend table SYS.AUD$ by 128 in tablespace SYSTEM [ABCD]
ORA-1653: unable to extend table SYS.AUD$ by 128 in tablespace SYSTEM [ABCD]
username is valid
Fri Feb 09 23:58:04 2024

다음 출력을 얻고 싶습니다.

i am a user
username is valid 
Fri Feb 09 23:58:04 2024

나는 시도했다:

sed -e '/ORA-1653/,+1 d' aa

이것은 나에게 다음을 제공합니다:

i am a user
Fri Feb 09 23:57:51 2024
Fri Feb 09 23:57:51 2024
Fri Feb 09 23:57:51 2024
Fri Feb 09 23:57:52 2024
Fri Feb 09 23:57:54 2024
Fri Feb 09 23:57:55 2024
Fri Feb 09 23:57:56 2024
username is valid
Fri Feb 09 23:58:04 2024

하지만 난 필요해

i am a user
username is valid 
Fri Feb 09 23:58:04 2024

어떻게 해야 하나요?

요구 사항은 끝(라인)에 타임스탬프를 인쇄하는 것만이 아닙니다. 요구 사항은 일치하는 단어가 발견되고(예: ORA-1653) 다음 다음 줄이 타임스탬프인 경우 이 두 행이 삭제되지만, 일치하는 단어가 없고 다음 다음 줄이 타임스탬프인 경우 타임스탬프는 다음과 같습니다. 삭제되지 않습니다.

답변1

그러면 제공한 입력을 기반으로 기대하는 출력이 생성됩니다.

$ head -n 1 file; tail -n 2 file
I am a user
username is valid
Fri Feb 09 23:58:04 2024

이것이 필요한 전부가 아닌 경우 질문을 편집하여 출력할 3개 행을 선택해야 하는 요구 사항을 알려주십시오.

답변2

-v열쇠를 사용할 수 있습니다 grep. 이 옵션이 없으면 grep패턴이 있는 라인이 인쇄되고, 옵션이 -v있으면 grep패턴이 없는 라인이 인쇄됩니다.

무시할 행 유형이 두 가지이므로 grep검색하려면 두 가지 모드가 필요합니다. 로 표시하십시오 -e.

따라서 다음을 시도해 볼 수 있습니다.

grep -v -e "ORA-1653" -e "Fri Feb" aa.text

답변3

가정:

  • 3가지 다른 라인 형식이 있습니다...
  • 형식 #1: 줄은 다음으로 시작됩니다.ORA
  • 형식 #2:행에 날짜/타임스탬프 형식이 포함됩니다.Day Mon dd hh:mm:ss yyyy
  • 형식 #3: 일치하지 않는 것형식 #1또는형식 #2
  • 목표는 ...
  • 무시하다형식 #1
  • 마지막 줄을 인쇄하다형식 #2
  • 모든 항목을 인쇄형식 #3

아이디어 awk:

awk '
BEGIN    { regex = "[0-2][0-9]:[0-5][0-9]:[0-5][0-9]" }    # hh:mm:ss

/^ORA/   {                next }                           # format #1

NF==5 &&
$4~regex { last_dt = $0 ; next }                           # format #2

1                                                          # format #3 (ie, everything else)

END      { print last_dt }
' aa.txt

그러면 다음이 생성됩니다.

I am a user
username is valid
Fri Feb 09 23:58:04 2024

답변4

사용행복하다(이전 Perl_6)

~$ raku -e 'my @day-of-week = <Sun Mon Tue Wed Thu Fri Sat>;  \
            for slurp() { 
                put S:g/ ^^ ORA \- 1653 \: \h .+? $$ [\n ^^ @day-of-week .+? $$]? \n // 
            };  file

#또는

~$ raku -e 'my @day-of-week = <Sun Mon Tue Wed Thu Fri Sat>;  \
            S:g/^^ ORA \- 1653 \: \h .+? $$ [\n ^^ @day-of-week .+? $$]? \n //.put for slurp;'  file

위 내용은 Perl 계열의 프로그래밍 언어인 Raku로 작성된 답변입니다. 파일이 slurp편집되고(메모리로 한 번 읽혀짐) 두 개의 대상 행이 S///Raku의 "big-S" 대체 연산자의 인식 도메인에 설명됩니다(명명된 인수를 사용하여 전역화됨 S:g///). 두 번째 줄은 [\n ^^ Fri .+? $$]?열거자에 대한 선택 사항입니다 ?. 교체된 절반에는 아무것도 없어 인식된 텍스트 시퀀스가 ​​제거됩니다.

입력 예:

ORA-1653: unable to extend table SYS.AUD$ by 128 in tablespace SYSTEM [PCRMR2S]
I am a user
ORA-1653: unable to extend table SYS.AUD$ by 128 in tablespace SYSTEM [PCRMR2S]
Fri Feb 09 23:57:51 2024
ORA-1653: unable to extend table SYS.AUD$ by 128 in tablespace SYSTEM [ABCD]
ORA-1653: unable to extend table SYS.AUD$ by 128 in tablespace SYSTEM [ABCD]
Fri Feb 09 23:57:51 2024
ORA-1653: unable to extend table SYS.AUD$ by 128 in tablespace SYSTEM [ABCD]
ORA-1653: unable to extend table SYS.AUD$ by 128 in tablespace SYSTEM [ABCD]
Fri Feb 09 23:57:51 2024
ORA-1653: unable to extend table SYS.AUD$ by 128 in tablespace SYSTEM [ABCD]
ORA-1653: unable to extend table SYS.AUD$ by 128 in tablespace SYSTEM [ABCD]
Fri Feb 09 23:57:51 2024
ORA-1653: unable to extend table SYS.AUD$ by 128 in tablespace SYSTEM [ABCD]
ORA-1653: unable to extend table SYS.AUD$ by 128 in tablespace SYSTEM [ABCD]
Fri Feb 09 23:57:52 2024
ORA-1653: unable to extend table SYS.AUD$ by 128 in tablespace SYSTEM [ABCD]
ORA-1653: unable to extend table SYS.AUD$ by 128 in tablespace SYSTEM [ABCD]
Fri Feb 09 23:57:54 2024
ORA-1653: unable to extend table SYS.AUD$ by 128 in tablespace SYSTEM [ABCD]
Fri Feb 09 23:57:54 2024
ORA-1653: unable to extend table SYS.AUD$ by 128 in tablespace SYSTEM [ABCD]
ORA-1653: unable to extend table SYS.AUD$ by 128 in tablespace SYSTEM [ABCD]
Fri Feb 09 23:57:55 2024
ORA-1653: unable to extend table SYS.AUD$ by 128 in tablespace SYSTEM [ABCD]
Fri Feb 09 23:57:56 2024
ORA-1653: unable to extend table SYS.AUD$ by 128 in tablespace SYSTEM [ABCD]
Fri Feb 09 23:57:56 2024
ORA-1653: unable to extend table SYS.AUD$ by 128 in tablespace SYSTEM [ABCD]
ORA-1653: unable to extend table SYS.AUD$ by 128 in tablespace SYSTEM [ABCD]
Fri Feb 09 23:57:56 2024
ORA-1653: unable to extend table SYS.AUD$ by 128 in tablespace SYSTEM [ABCD]
Fri Feb 09 23:57:56 2024
ORA-1653: unable to extend table SYS.AUD$ by 128 in tablespace SYSTEM [ABCD]
ORA-1653: unable to extend table SYS.AUD$ by 128 in tablespace SYSTEM [ABCD]
ORA-1653: unable to extend table SYS.AUD$ by 128 in tablespace SYSTEM [ABCD]
Fri Feb 09 23:58:03 2024
ORA-1653: unable to extend table SYS.AUD$ by 128 in tablespace SYSTEM [ABCD]
ORA-1653: unable to extend table SYS.AUD$ by 128 in tablespace SYSTEM [ABCD]
username is valid
Fri Feb 09 23:58:04 2024

예제 출력:

I am a user
username is valid
Fri Feb 09 23:58:04 2024

\n위의 "예제 출력" 끝에 개행 문자가 삽입된 것 같습니다. 이것이 문제라면 .trim-trailing과 final 사이에 루틴 호출을 삽입하여 해결할 수 있습니다.S:g///.put


slurp위의 방법은 파일에 대한 메모리가 한 번에 있는 경우에 작동합니다. 크기가 문제인 경우 아래 답변은 input_file을 한 줄씩 읽습니다. 라쿠를 사용한다3위안연산자(Perl과 철자가 약간 다름):시험 ?? 진짜 !! 잘못된.

~$ raku -e 'my @day-of-week = <Sun Mon Tue Wed Thu Fri Sat>; my $flag = 0; \
            for lines() { / ^ ORA \- 1653 \: \h .+ $ /          \
                ?? ( $flag=1 andthen next )                     \
                !! ( $flag == 1 and / ^ @day-of-week .+ $ /)    \
                    ?? ( $flag=0 andthen next )                 \
                    !! ( .put andthen $flag=0 ) };'   file
I am a user
username is valid
Fri Feb 09 23:58:04 2024

https://docs.raku.org/routine/slurp
https://docs.raku.org/언어/regexes#S///_non-breaking_substitution
https://docs.raku.org/언어/operators#infix_??_!!
https://raku.org

관련 정보