执行一个简单的操作很容易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
。
要将列表结果放入另一个数组中,在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
或者对于任意文件路径(除了特殊-
解释grep
为 stdin 而不是名为 的文件-
):
grep -qe Results -- "$file" &&
! grep -qe NOK -- "$file" &&
printf '%s\n' "$file"