用于自动化并行 grep 的简单 Makefile 返回错误

Simple Makefile for automating parallel grep is returning an error

我经常使用 Makefile 来自动执行重复执行的任务。例如,一项任务涉及在不断增长的数据集中搜索正则表达式匹配项。假设我有以下两个文本文件,search1.txtsearch2.txt:

search1.txt:

DSADJKBSDJSA
TEST1
DJKSABVDJSA

search2.txt:

hvdsjhavdjshavdsa
dsadsadsadsa
TEST3djsabdjhsavdjhsa
TEST2dsajdbsahjdvsa

这是我的 Makefile,用于使用 GNU parallel 并行搜索这些文件。

.PHONY: search
search:
    find search*.txt | parallel grep TEST1 {}
    find search*.txt | parallel grep TEST2 {}

当我 运行 make search 时,第一行输出正确的数据然后抛出错误并退出,尽管 运行ning 这两行都是自己完成的很好。

> make search
find *.txt | parallel grep TEST1 {}
TEST1
make: *** [search] Error 1
> find *.txt | parallel grep TEST1 {}
TEST1
> find *.txt | parallel grep TEST2 {}
TEST2dsajdbsahjdvsa
> parallel --version
GNU parallel 20160822

我这辈子都弄不明白我做错了什么。它一定是显而易见的,但我已经将其提炼成一个如此简单的小例子,但我仍然对为什么会这样感到困惑。感谢我得到的任何帮助!

啊哈!我想到了。结果是 grep 有一个退出状态导致了这个。来自 grep 手册页:

EXIT STATUS
     The grep utility exits with one of the following values:

     0     One or more lines were selected.
     1     No lines were selected.
     >1    An error occurred.

由于我正在搜索的一些文件不包含匹配项,grep 将 return 退出状态为 1。这有一个非常简单的修复:

.PHONY: search
search:
    find search*.txt | parallel grep TEST1 {} || true
    find search*.txt | parallel grep TEST2 {} || true