Grep
如何為 grep -l 命令添加例外?
執行一個簡單的 很容易,如果至少有一行.將返回
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
。要將列表結果放入另一個數組中,在
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"