如何同时打印和管道日志文件?

not*_*vvy 5 bash grep tee

我用它来检查日志文件的日志行,直到发生特定事件(取自此答案“监视文件直到找到字符串”):

(tail -f -n 0 test.log &) | grep -q 'SPEFICIC LOG MESSAGE'
Run Code Online (Sandbox Code Playgroud)

这可行,但我还希望在等待事件时将日志行打印到标准输出。我正在寻找类似的东西tee,但我想同时打印和管道。

我尝试了这个答案来管道并观察管道输出?, 导致:

(tail -f -n 0 test.log &) | tee /dev/fd/2 | grep -q 'SPEFICIC LOG MESSAGE'
Run Code Online (Sandbox Code Playgroud)

但随后该命令永远不会退出,大概是因为在找到匹配项时grep无法中断,因此继续将数据传送到?tailtailtee

Kam*_*ski 5

退出后greptee只有当它尝试向管道写入更多内容时,您才会因 SIGPIPE 而退出。这就是管道的工作原理。这意味着您还需要一行来自tail. 最终tee会退出,除非打印后永远保持沉默。tailSPEFICIC LOG MESSAGE

\n

tail \xe2\x80\xa6 | grep \xe2\x80\xa6总体上是相似的。的技巧(tail \xe2\x80\xa6 &)使你的主 shell 不等待tail(它等待子 shell,而子 shell 不等待,这要归功于tail&

\n

您可以使用相同的技巧tee

\n
(tail -f -n 0 test.log &) | (tee /dev/fd/2 &) | grep -q \'SPEFICIC LOG MESSAGE\'\n
Run Code Online (Sandbox Code Playgroud)\n

主 shell 将等待两个子 shell 和grep。子 shell 几乎会立即退出,所以这才是grep最重要的。退出时grep,主 shell 将继续。

\n

tee将停留在后台,直到尝试写入更多内容。只有这样它才会收到 SIGPIPE 并退出。这需要日志中额外一行。

\n

反过来tail将停留在后台,直到退出后尝试写入更多内容tee。这需要日志中的另一行。除非你tail很聪明。GNUtail立即检测到损坏的管道,它不需要技巧。在 GNU 中使用该技巧tail是无害的,因此当有疑问时,请使用它。

\n

tee不是那么聪明,它确实需要技巧。

\n

我给您的命令应该可以工作,但请记住teetail它将保留在后台,直到日志中出现下一行。如果你的尾巴不聪明,那么它会留下另一条线。

\n

  • 不会 `(tail -f -n 0 test.log | tee /dev/fd/2 &) | grep -q 'SPEFICIC LOG MESSAGE'` 也可以吗? (3认同)

归档时间:

查看次数:

1506 次

最近记录:

3 年,2 月 前