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"
我正在尝试使用 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"