Grep은 문자열을 찾았지만 문자열이 포함된 주석 처리된 항목을 무시합니다.

Grep은 문자열을 찾았지만 문자열이 포함된 주석 처리된 항목을 무시합니다.

gmail단어 나 카테고리를 찾고 있어요 outlook. 일부 행은 주석 처리되어 gmail있습니다 outlook. 나는 무엇을 grep해야 합니까?

나는 많은 것을 시도했지만 다음과 같을 것이라고 생각했습니다.

grep "^[^#;]" | egrep -i "gmail|outlook" *.ksh  > a.log

답변1

그리고 grep:

grep -P '^(?=[\s]*+[^#])[^#]*(gmail|outlook)' file
  • -PPerl 호환 정규식을 활성화합니다.
  • ^(?=...)패턴의 일부가 아닌 캡처링 그룹(미리보기, Perl 확장)을 정의합니다. 이는 ^줄의 시작을 의미합니다.
    • 이 그룹은 내부적으로 \s모든 공백 문자와 일치하고 , *+공백과 0회 이상 일치하며, 탐욕적입니다(Perl 확장자).
    • [^#]일치하지 않는 모든 항목과 일치합니다 #.
  • [^#]*캡처 그룹 외부에서 #0번 이상 존재하지 않는 문자를 다시 일치시킵니다.
  • (gmail|outlook)마지막 경기 gmail또는outlook

다양한 예제를 사용하여 테스트 파일을 만들었습니다.

$ cat file
# outlook
blah gmail # this should match
# gmail
  # gmail
        # foo
blah outlook # this should match
  outlook blah # gmail - this should match
foobar # gmail
        bar
        another gmail # this should match

출력은 다음과 같습니다

blah gmail # this should match
blah outlook # this should match
  outlook blah # gmail - this should match
        another gmail # this should match

물론 *.ksh모든 파일에 대해 이 명령을 실행할 수 있습니다.

grep -P '^(?=[\s]*+[^#])[^#]*(gmail|outlook)' *.ksh  > a.log

답변2

따라서 .ksh해당 문자열에 대해 현재 디렉터리의 모든 파일을 검색 하고 . 로 시작하는 줄을 제외 gmail하고 출력을 .outlook#a.log

좋아요grep -P "^(?=[^#])(.*gmail.*|.*outlook.*)" *.ksh > a.log

답변3

사용하는 방법:

egrep "gmail|outlook" *.ksh | grep -v ^[#]

먼저 grep"gmail" 또는 "outlook"이 포함된 모든 줄을 가져오고, 두 번째는 grep주석 줄을 무시합니다.

관련 정보