grep -l <pattern> <file_name>
where 가 포함된 행이 하나 이상 있는 경우 반환되는 간단한 작업을 수행하는 것은 쉽습니다 <file_name>
.<file_name>
<pattern>
가 있는 행이 하나 이상 있으면 반환 <exception_pattern>
하는 패턴을 추가하고 싶지만 행이 하나 이상 있으면 반환해서는 안 됩니다 .<file_name>
<pattern>
<exception_pattern>
예:
$ cat file1
Results: 1, 2, 3
OK
$ cat file2
Results: 1, 2, 3
NOK
$ grep -l Results file1
file1
$ grep -l Results file2
file2
$ grep -l Results -exception NOK file1
file1
$ grep -l Results -exception NOK file2
$
$
답변1
GNU 도구 사용:
grep -lZe Results -- "${files[@]}" | xargs -r0 grep -Le NOK --
배열은 $files
파일 이름 목록을 보유합니다.
-L
(일명 --files-without-match
)은 일치하지 않는 파일 이름을 인쇄하고 성공적으로 읽을 수 있는 GNU 확장입니다. 따라서 먼저 grep
포함된 파일 목록을 작성 Results
하고 xargs
해당 파일을 두 번째 파일에 대한 인수로 전달한 grep
다음 두 번째 파일은 포함되지 않은 파일에 대해 보고합니다 NOK
.
목록 결과를 다른 배열에 넣으려면 bash
4.4+에서 다음을 수행해야 합니다.
readarray -td '' matching_files < <(
grep -lZe Results -- "${files[@]}" | xargs -r0 grep -LZe NOK --
)
(명령 간에 파일 목록을 전달하려면 NUL로 구분된 레코드를 사용하는 것이 중요합니다.)
존재하다 zsh
:
matching_files=( ${(0)"$(
grep -lZe Results -- $files | xargs -r0 grep -LZe NOK --
)"} )
단일 파일의 경우 표준적으로 항상 다음을 수행할 수 있습니다.
grep -q Results file1 && ! grep -q NOK file1 && echo file1
또는 모든 파일 경로의 경우( named file 대신 stdin으로 -
해석되는 특수 경로 제외 ):grep
-
grep -qe Results -- "$file" &&
! grep -qe NOK -- "$file" &&
printf '%s\n' "$file"