"BUG"를 발생시키지 않고 grep에서 "DEBUG"를 제외하는 방법

"BUG"를 발생시키지 않고 grep에서 "DEBUG"를 제외하는 방법

일반적인 오류 키워드(예: , , ) 목록을 grep하는 명령을 작성하려고 bug occured!하지만 일치하는 줄을 버리지 않고 일반 키워드(예: 태그)도 제외해야 합니다. 명령은 다양한 소스/로그를 처리할 수 있을 만큼 강력해야 합니다.errorexceptionDEBUG

다음 소스가 있다고 가정해 보겠습니다.

$ cat dummy.log 
12345   DEBUG   debug.log abc
!DEBUG
!bug
!debug
DEBUG noop
12345 DEBUG bug occured
please report BUG to me
the filename is critical_bug.log
bug should be fix.
noop
throws error
a stuff
b otherstuff
c otherstuff stuff

bug이 명령은 다음을 12345 DEBUG bug occured포함 하는 행을 제외하므로 작동하지 않습니다 DEBUG.

$ cat -v dummy.log | nl | grep -Ei 'bug|stuff|error' | grep -Evi 'DEBUG|otherstuff'
 3  !bug
 7  please report BUG to me
 8  the filename is critical_bug.log
 9  bug should be fix.
11  throws error
12  a stuff

파이프 교체 순서도 위와 동일합니다.

$ cat -v dummy.log | nl | grep -Evi 'DEBUG|otherstuff' | grep -Ei 'bug|stuff|error'
 3  !bug
 7  please report BUG to me
 8  the filename is critical_bug.log
 9  bug should be fix.
11  throws error
12  a stuff

^([고쳐 쓰다]거짓, ^제외에 사용되지 않음DEBUG noop), 그러나 그렇지 않은 항목도 포함합니다 bug(참고: 모든 필터는 대소문자를 구분해야 합니다. 예: I want to accept BUG occured!and extra debug.log).

 $ cat -v dummy.log | nl | grep -Ei 'bug|stuff|error|^DEBUG|^otherstuff'
 1  12345   DEBUG   debug.log abc
 2  !DEBUG
 3  !bug
 4  !debug
 5  DEBUG noop
 6  12345 DEBUG bug occured
 7  please report BUG to me
 8  the filename is critical_bug.log
 9  bug should be fix.
11  throws error
12  a stuff
13  b otherstuff
14  c otherstuff stuff

debug다음을 사용하는 경우에만 제외를 사용자 정의할 수 있습니다 -w(예: 포함 실패).the filename is critical_bug.log

$ grep -wnEi 'bug|stuff|error' dummy.log 
3:!bug
6:12345 DEBUG bug occured
7:please report BUG to me
9:bug should be fix.
11:throws error
12:a stuff
14:c otherstuff stuff

내 예상 출력(참고: 일치하는 색상과 원래 줄 번호를 유지해야 함):

$ grep -wnEi 'bug|stuff|error' dummy.log 
3:!bug
6:12345 DEBUG bug occured
7:please report BUG to me
8:the filename is critical_bug.log
9:bug should be fix.
11:throws error
12:a stuff
14:c otherstuff stuff

grep이 명령이나 대안을 사용할 수 있습니까 ?

답변1

GNU grep(Linux의 기본값)를 가정하면 PCRE 모드를 사용할 수 있으며부정적인 리뷰:

$ grep -niP '(?<!de)bug|(?<!other)stuff|error' dummy.log 
3:!bug
6:12345 DEBUG bug occured
7:please report BUG to me
8:the filename is critical_bug.log
9:bug should be fix.
11:throws error
12:a stuff
14:c otherstuff stuff

사용되는 옵션은 다음과 같습니다.

-n, --line-number
    Prefix each line of output with the 1-based line number within 
        its input file.

-i, --ignore-case
    Ignore case distinctions in patterns and input data, so that
    characters that differ only in case match each other.

-P, --perl-regexp
    Interpret  PATTERNS  as  Perl-compatible regular expressions (PCREs).
    This option is experimental when combined with the  -z  (--null-data)
    option, and grep -P may warn of unimplemented features.

마법은 돌이켜보면 일어납니다. 일반적인 형식은 (?!<foo)bar"일치 bar하지만 "을 의미하는 입니다.오직foo앞에 ". 가 없으면 뒤에 나타나지 않는 한 (?<!de)bug일치하고 , 뒤에 나타나지 않으면 일치합니다 .bugde(?<!other)stuffstuffother

관련 정보