我使用它来检查日志文件的日志行,直到发生特定事件(取自这个答案监视文件直到找到字符串):
(tail -f -n 0 test.log &) | grep -q 'SPEFICIC LOG MESSAGE'
这可行,但我希望在等待事件时将日志行打印到 stdout。我正在寻找类似的东西tee
,但我想同时打印和管道。
我试过这个答案管道并观察管道输出?, 导致:
(tail -f -n 0 test.log &) | tee /dev/fd/2 | grep -q 'SPEFICIC LOG MESSAGE'
但是命令永远不会停止,大概是因为找到匹配项时grep
无法中断,所以继续将数据传送到?tail
tail
tee
答案1
grep
退出后,tee
只有当尝试向管道写入更多内容时,您的 will 才会因 SIGPIPE 而退出。这就是管道的工作方式。这意味着您需要从tail
. tee
will exit最终,除非tail
打印后永远沉默SPEFICIC LOG MESSAGE
。
tail … | grep …
总体来说类似。使用 的技巧(tail … &)
可使主 shell 不等待tail
(它改为等待子 shell,而子 shell 则由于 而不等待tail
) &
。
您可以使用相同的技巧tee
:
(tail -f -n 0 test.log &) | (tee /dev/fd/2 &) | grep -q 'SPEFICIC LOG MESSAGE'
主 shell 将等待两个子 shell 和grep
。子 shell 几乎会立即退出,所以这才是grep
最重要的。grep
退出后,主 shell 将继续运行。
tee
会一直留在后台,直到尝试写入更多内容。只有这样它才会收到 SIGPIPE 并退出。这需要日志中多一行。
反过来,tail
它会一直留在后台,直到退出后尝试写入更多内容tee
。这需要日志中的另一行。除非你tail
很聪明。GNUtail
会立即检测到管道损坏,因此不需要该技巧。在 GNU 中使用该技巧tail
是无害的,因此如有疑问,请使用它。
tee
并不是那么聪明,它确实需要技巧。
我给你的命令应该可以工作,但请记住tee
,它tail
会一直留在后台,直到下一行出现在日志中。如果你的尾巴不够聪明,那么它会再停留一行。