grep 在显示请求的匹配数后不会终止

grep doesn't terminate after showing requested number of matches

我正在尝试使用 grep 输出第一个匹配项并终止。在我的例子中,正在搜索的流来自 Android logcat,但这可能无关紧要:

adb logcat | grep -m1 SomeFilter

我使用 -m 选项将结果限制为单个匹配项。如果输入流包含多个匹配项,则会显示第一个匹配项,并且 grep 会按预期终止。但是,如果输入流中只有一个匹配项,则会显示该匹配项,但 grep 永远不会终止。知道为什么吗?

有3个想法。

1) 输入流中既没有LF符号也没有EOF。

2) grep 实际上是在看到第一场比赛后终止。但是 adb 并没有终止,尽管 grep 退出并且写入管道失败。 adb 只是忽略这些写入错误并保留 运行。您可以检查 grep 是否真的终止了,只需在另一个终端输入 pgrep grep

3) 最有可能的是,如果真的只有一个匹配项,仅此而已,那么可能 adb 不再向管道写入数据,并且它永远不会收到写入错误和 SIGPIPE。因此 adb 仍然是 运行 而 grep 实际上已经终止。

我知道这是一个老问题,但也许这会对遇到此问题的其他人有所帮助。如果不能使用 -d 选项,另一种选择是:

adb logcat -m1 -e "SomeFilter"