일반적인 오류 키워드(예: , , ) 목록을 grep하는 명령을 작성하려고 bug occured!
하지만 일치하는 줄을 버리지 않고 일반 키워드(예: 태그)도 제외해야 합니다. 명령은 다양한 소스/로그를 처리할 수 있을 만큼 강력해야 합니다.error
exception
DEBUG
다음 소스가 있다고 가정해 보겠습니다.
$ 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
일치하고 , 뒤에 나타나지 않으면 일치합니다 .bug
de
(?<!other)stuff
stuff
other