grep -l 명령에 예외를 추가하는 방법은 무엇입니까?

grep -l 명령에 예외를 추가하는 방법은 무엇입니까?

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.

목록 결과를 다른 배열에 넣으려면 bash4.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"

관련 정보