grep -v로 파이프 찾기

grep -v로 파이프 찾기

특정 유형이고 특정 문자열을 포함하지 않는 모든 파일을 찾으려고 합니다. grep -v에 find를 연결하여 문제를 해결하려고 합니다.

예:

find -type f -name '*.java' | xargs grep -v "something something"

이것은 작동하지 않는 것 같습니다. find 명령으로 찾은 모든 파일을 반환하는 것 같습니다. 내가 하려는 것은 기본적으로 특정 파일 이름(예: SessionPb.java에서와 같이 'Pb'로 끝남)과 일치하고 내부에 'extends SomethingSomething'이 없는 모든 .java 파일을 찾는 것입니다.

내 의심은 내가 잘못하고 있다는 것입니다. 그렇다면 명령은 어떻게 생겼을까요?

답변1

여기 에는 필요가 없습니다 xargs. 또한 옵션(일치하지 않는 파일) grep과 함께 사용해야 합니다 -L. 그렇지 않으면 예제에서처럼 이름 대신 파일 내용이 출력됩니다.

find . -type f -iname "*.java" -exec grep -L "something somethin" {} \+

답변2

정말 거의 다 됐어요...

find . -type f -iname "*.java" -print0 | xargs -0 grep -v "something something"

점 '.' 여기서부터 시작하라고 하네요. (당신은 그것을 암시하지만 .. 결코 가정하지 마십시오).

-iname경우에 따라(또는 대소문자가 없는 경우) 대소문자를 구분하지 않는 검색을 사용합니다.
-인쇄0후행 \x00 문자를 사용하여 파일 이름을 xargs로 보내 파일 이름에 공백이 있는 문제를 방지합니다.

xargs의 '-0'은 반환 대신 \x00으로 끝나는 파일 이름을 예상한다는 의미입니다.

그리고 당신의 grep 명령 ...

꽤 많이 얻었습니다.


편집하다::

업데이트 내용:

find . -type f -iname "*pb.java" -print0 | xargs -0 grep -iL "something"

도움이 될 것입니다. (@rush의 답변에 -L을 추가했습니다. 잘하셨습니다)

귀하의 grep에는 '-i' 옵션이 필요하거나 덜 명시적이어야 한다는 생각이 듭니다.

명령을 부분적으로 시도해 보십시오... 이 출력 파일 이름이 적절해 보이나요?

find . -type f -iname "*pb.java"

그렇다면 문제는 grep 검색 패턴이 일치하지 않거나(철자 오류? 발생합니다!) 일치하는 항목이 없을 가능성이 높습니다.

절대 최악의 경우:

grep -riL "something" *

모든 것을 검색하는 데 훨씬 더 많은 작업을 수행하지만 일부 결과를 제공해야 합니다.

답변3

컴퓨터는 컴퓨터입니다. 컴퓨터는 사용자가 원하는 작업 대신 사용자가 지시한 작업을 수행합니다.

grep -v "something something"를 포함하지 않는 모든 줄을 인쇄합니다 something something. 예를 들어 다음 세 줄 중 두 줄을 인쇄합니다.

hello world
this is something something
something else

extends SomethingSomething어디에도 포함되지 않은 파일을 인쇄하려면 다음 -L옵션을 사용하십시오.

grep -L -E 'extends[[:space:]]+SomethingSomething' FILENAME…

일부 grep 버전에는 옵션이 없습니다 -L.POSIX). 그렇지 않은 경우 아무것도 인쇄하지 않고 반환 코드를 사용하여 호출 쉘이 대신 수행해야 하는 모든 작업을 수행하도록 합니다.

grep -q -E 'extends[[:space:]]+SomethingSomething' FILENAME ||
echo "$FILENAME"

또는 awk를 사용하세요.

awk '
    FNR == 1 && NR != 1 && !found { print fn }
    FNR == 1 { fn = FILENAME; found = 0; }
    /extends[[:space:]]+SomethingSomething/ { found = 1 }
    END { if (fn != "" && !found) print fn }
'

Linux나 Cygwin(또는 GNU grep을 사용하는 다른 시스템)에서는 반복이 가능하므로 를 find사용할 필요가 없습니다 .grep

grep -R --include='*.java' -L -E 'extends[[:space:]]+SomethingSomething'

쉘이 ksh, bash 또는 zsh인 경우 쉘이 파일 이름 일치를 수행하도록 할 수 있습니다. Bash에서는 set -o globstar먼저 실행하십시오(이것을 에 넣을 수 있습니다 ~/.bashrc).

grep -L -E 'extends[[:space:]]+SomethingSomething' **/*.java

답변4

find -type f -name '*.java' 2>&1 | grep -v "something something"

"grepping out"하는 내용은 stdout이 아닌 stderr에 표시됩니다.

위의 명령은 stderr를 stdout으로 리디렉션합니다.

원천

관련 정보