"grep -v -l"은 "grep -L"과 동일합니까?

"grep -v -l"은 "grep -L"과 동일합니까?

가끔씩 the 대신 grep's -v와 스위치를 함께 사용하도록 제안하는 답변(또는 설명)이 있을 것입니다 (특히 후자가 사용할 수 없는 경우). 저자는 그것들이 동등하다고 믿는 것 같습니다.-l-L

그렇다면 서로 바꿔서 사용할 수 있나요? IOW, grep -v -l와 같은 결과가 나올까요 grep -L?

답변1

아니요, 동일하지 않으므로 결과는 다음과 같습니다.거의 언제나1은 다릅니다.
각 스위치의 기능을 살펴보겠습니다.

‘-L’
‘--files-without-match’
     Suppress normal output; instead print the name of each input file
     from which no output would normally have been printed.

이는 간단해야 합니다.
grep -L 'pattern' ./*
일치하는 줄이 포함되지 않은 모든 파일의 이름을 인쇄합니다 'pattern'.

‘-v’
‘--invert-match’
     Invert the sense of matching, to select non-matching lines.

이 작업도 매우 간단합니다.
grep -v 'pattern' ./*
각 파일에서 일치하지 않는 모든 줄을 인쇄합니다.'pattern'

‘-l’
‘--files-with-matches’
     Suppress normal output; instead print the name of each input file
     from which output would normally have been printed.

다시 말하지만, 간단합니다.
grep -l 'pattern' ./*
일치하는 줄이 하나 이상 포함된 모든 파일의 이름을 인쇄합니다 'pattern'.

이제 합을 합치면 -v어떻게 될까요 -l? grep -l일치하지 않는 행을 선택하여
grep -vl 'pattern' ./*
일치하지 않는 행이 하나 이상 포함된 모든 파일의 이름을 인쇄한다는 점을 제외 하면 와 크게 다르지 않습니다 'pattern'.


따라서 차이점에 유의하시기 바랍니다.

grep -L파일 이름 인쇄일치하는 행이 없는 경우에만 'pattern'
grep -vl파일 이름 인쇄하나 이상의 행이 일치하지 않는 경우에만 'pattern'


1:
위의 내용을 바탕으로 이 두 명령이 언제 동일한 출력을 생성할 수 있는지 쉽게 알 수 있습니다.
- 파일이 비어 있지 않고모두행이 패턴과 일치하는 경우(이 경우 출력이 없음
) 또는 파일이 비어 있지 않고아니요행이 패턴과 일치함 - 이 경우 나열됩니다.


이야기의 교훈: grep -vl모방을 위해 사용하지 마십시오 grep -L. 지원 하지 않는
경우grep-L이것이 시뮬레이션하는 올바른 방법입니다..

답변2

추가 참고 사항으로, 이 옵션(GNU 확장)을 grep지원하지 않는 시스템에서는 @don_crissti가 표시한 방법을 사용하는 것이 도움이 되지 않으며 쉘 루핑을 사용해야 합니다. 동등하다-L-vl

grep -L pattern ./*

할 것이다:

for file in ./*; do
  {
     grep -q pattern || printf '%s\n' "$file"
  } < "$file"
done

파일을 열 수 없도록 하려는 경우 파일 이름을 인쇄하는 {...}대신 리디렉션이 전체적으로 수행되는 것을 확인할 수 있습니다 .grep

동등한 항목 grep -ZL pattern ./*(이 출력을 안정적으로 사후 처리할 수 있으려면 필요함) 의 경우 위 항목 %s\n을 바꾸세요 %s\0.

GNU에 해당하는 경우 grep -rL pattern .다음을 수행할 수 있습니다.

find . -type f ! -exec grep -q pattern {} \; -print

읽을 수 없는 파일의 이름도 인쇄하지만( -readable find술어를 사용할 수 있지만 GNU 확장자이기도 하므로 grep지원하지 않으면 지원 하지 않을 -L가능성 이 높습니다 ).find-readable

그리고 zsh:

for f (./**/*(DN.)) {{grep -q pattern || print -r $f}<$f}

답변3

각 옵션 조합을 나타내는 수식을 사용해 보겠습니다.

  • n다음 줄을 포함하는 파일이 있습니다.
  • 행의 텍스트 i는 다음과 같이 표시됩니다. L(i)
  • match(L(i))L(i)검색 패턴과 일치함을 나타냅니다.

-l: 일치하는 줄이 하나 이상 있는 파일

-엘

-L: 일치하는 파일이 없습니다.

-엘

-vl: 파일에 일치하지 않는 행이 하나 이상 있습니다.

-vl

-vL: 빈 파일 또는 모든 줄이 일치하는 파일

-vL

관련 정보