Grep

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

  • March 17, 2022

執行一個簡單的 很容易,如果至少有一行.將返回grep -l <pattern> <file_name>where 。<file_name>``<file_name>``<pattern>

我只想添加一個<exception_pattern>模式,<file_name>如果它至少有一行 with 則返回其中,<pattern>但如果它至少有一行 with 則不應該返回<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
$
$

使用 GNU 工具:

grep -lZe Results -- "${files[@]}" | xargs -r0 grep -Le NOK --

$files數組包含文件名列表。

-L(aka --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"

引用自:https://unix.stackexchange.com/questions/694841