如何为 grep -l 命令添加例外?

如何为 grep -l 命令添加例外?

执行一个简单的操作很容易grep -l <pattern> <file_name>,如果至少有一行带有,<file_name>则将返回where 。<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

或者对于任意文件路径(除了特殊-解释grep为 stdin 而不是名为 的文件-):

grep -qe Results -- "$file" &&
  ! grep -qe NOK -- "$file" &&
  printf '%s\n' "$file"

相关内容