파일 내부를 찾기 위한 파이프라인 grep

파일 내부를 찾기 위한 파이프라인 grep

(우분투가 아닌 리눅스와 관련이 있고 내 OS가 우분투가 아니기 때문에 Ask-ubuntu에서 자체 마이그레이션)

나는 다음과 같은 grep을 만들려고합니다.

grep -r 2019 | grep -riv FAILED | grep -rl DSL

-l( )이 포함되어 있고 포함되어 있는 것이 아니라 ( )이 포함된 파일의 파일 이름을 얻고 싶습니다 .2019-vFAILEDDSL

여기서는 마지막 grep만 실행됩니다. 나는 이것이 때문이라는 것을 알고 있으므로 -r각 grep은 이전 결과 대신 모든 파일을 grep합니다. 하지만 없이는 어떻게 작동하게 할 수 있는지 모르겠습니다 -r.

아마도 여러 패턴을 사용하여 grep하는 또 다른 방법이 있을 수 있지만 "긍정적" 및 "부정적" 일치 항목을 찾지 못했습니다.

답변1

grep파이프의 마지막 항목은 이전 항목에서 읽혀지므로 grep(해당 옵션을 사용하지 않은 경우 -r나중에 참조) 무엇부터 시작해야 할지 알 수 없습니다.문서데이터는 다음에서 제공되며 이는 파일의 경로 이름을 보고할 수 없음을 의미합니다.

대신 find다음과 같이 사용해 보세요.

find . -type f \
    -exec grep -q 2019 {} \; \
    -exec grep -q DSL {} \; \
    ! -exec grep -qi FAILED {} \; \
    -print

이는 현재 디렉터리와 하위 디렉터리의 모든 일반 파일을 (재귀적으로) 가져와서 문자열 2019, DSLFAILED(대소문자 구분 안 함)이 포함되어 있는지 테스트합니다. 처음 두 문자열을 포함하는 파일의 경로 이름을 인쇄하지만 세 번째 문자열은 인쇄하지 않습니다.

파일이 포함되지 않은 경우 다른 두 테스트는 수행되지 않으며 2019, 포함되지 않은 경우 마지막 테스트는 수행되지 않습니다 DSL.

세 번째 테스트에서는 grep -v -qi FAILED부정을 사용하지 않았습니다 . grep -qi FAILED나는 파일에 그렇지 않은 행이 포함되어 있는지 여부에 관심이 없으며 FAILED파일에 포함되어 있는지 여부에 관심이 있습니다.포함하다 FAILED, 이 경우 이 파일을 건너뛰고 싶습니다.

관련된:


배관 문제,

grep -r 2019 | grep -riv FAILED | grep -rl DSL

grep현재 디렉터리와 그 아래 디렉터리에 있는 모든 파일을 재귀적으로 찾고 파이프라인의 이전 단계의 입력을 무시하는 마지막 디렉터리입니다 . 두 번의 초기 grep호출은 일부 데이터를 생성할 수 있지만 파이프를 통해 해당 데이터를 전달할 수 없으며 결국 grep마지막 호출이 완료되면 종료됩니다.

또한 위에서 이미 지적했듯이 middle은 을 grep포함하지 않는 파일을 찾지 않고 FAILED, Except 를 포함하는 파일을 찾습니다 FAILED. 그건 그렇고, 그럴거야반품이전 입력을 무시합니다 grep.

답변2

GNU grep( -r이미 GNU 확장) 및 GNU 와 호환 가능 xargs또는:

grep -rlZ 2019 . |
  xargs -r0 grep -LiZ FAILED |
  xargs -r0 grep -l DSL

xargs파일 목록을 전달할 수 있어야 합니다 .산출하나씩grep논쟁다음 으로 grep. 그리고 -Z파일 목록은 NUL로 구분됩니다. FAILED를 포함하지 않는 파일 목록을 보고하기 위해 이 도구 -L(GNU 확장자이기도 함)는 대신 -vl일치하지 않는 행이 하나 이상 포함된 파일을 보고합니다.

이렇게 하면 호출 수를 grep최소한으로 제한해야 하며, 파일 수가 많은 경우 최대 3개의 프로세서를 동시에 활용할 수 있습니다.

관련 정보