'tail -f'在通过grep传输时不会给出单行

Phi*_*ore 7 bash

我正在推出一个网站,我想设置一个Bash单行,所以当有人点击该网站时,它会使用内部蜂鸣器发出哔哔声.

到目前为止,它使用以下工作.

tail -f access_log | while read x ; do echo -ne '\007' $x '\n' ; done
Run Code Online (Sandbox Code Playgroud)

Tail跟随access_log并转储到STDOUT,一次获得STDOUT行,用"\ 007""内部蜂鸣声十六进制代码"回显该行,并完成...

这就像一个美女...每次击中都会显示日志中的线条并发出哔哔声...但是,它很快就会烦人,所以理想情况下我想tail -f /access/log在它被管道输入之前过滤它while以便只读取我关心的线条.我认为grep "/index.php"这将是游客的一个很好的迹象......

这就是问题所在......

我可以...

tail -f access_log | while read x ; do echo -ne '\007' $x '\n' ; done
Run Code Online (Sandbox Code Playgroud)

一切都在发出哔哔声,我可以......

tail -f access_log | grep "/index.php"
Run Code Online (Sandbox Code Playgroud)

和页面显示没有蜂鸣声,但当我这样做

tail -f access_log | grep "/index.php" | while read x ; do echo -ne '\007' $x '\n' ; done
Run Code Online (Sandbox Code Playgroud)

什么都没发生,没有来自日志的行,没有发出哔哔声.

我认为grep在某个地方搞乱了,但我无法弄清楚在哪里.我喜欢它是一个单行,我知道它应该在脚本中完成并且会更容易,但它并不能解释为什么我认为应该工作的上述内容不是.

Joh*_*ica 14

Grep的输出在管道中使用时会被缓冲.使用--line-buffered强制它使用行缓冲,因此立即输出线.

tail -f access_log | grep --line-buffered "/index.php" | while read x ; do echo -ne '\007' $x '\n' ; done
Run Code Online (Sandbox Code Playgroud)

您还可以将grepand while循环组合到一个awk调用中:

tail -f access_log | awk '/\/index.php/ { print "\007" $0 }'
Run Code Online (Sandbox Code Playgroud)


cdh*_*wie 7

当标准输出不是终端时,Grep缓冲输出.您需要将--line-buffered开关传递给grep以强制它在写入行时刷新标准输出.