가끔씩 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}