8

我正在启动一个网站,我想设置一个 Bash 单线,这样当有人点击该网站时,它会使用内部蜂鸣器发出哔声。

到目前为止,它正在使用以下内容。

tail -f access_log | while read x ; do echo -ne '\007' $x '\n' ; done

Tail 跟随 access_log 并转储到 STDOUT,一次获取 STDOUT 行,用 '\007' "internal beep hex code" 回显该行,然后完成...

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

这就是问题所在...

我可以...

tail -f access_log | while read x ; do echo -ne '\007' $x '\n' ; done

哔哔声,我可以做...

tail -f access_log | grep "/index.php"

并且页面显示时没有哔哔声,但是当我这样做时

tail -f access_log | grep "/index.php" | while read x ; do echo -ne '\007' $x '\n' ; done

没有任何反应,日志中没有一行,没有哔哔声。

我认为 grep 在某个地方搞砸了,但我不知道在哪里。我希望它是一个单行,而且我知道它确实应该在脚本中完成并且会更容易,但它并没有解释为什么我认为应该工作的上述内容不是。

4

2 回答 2

15

Grep 的输出在管道中使用时会被缓冲。用于--line-buffered强制它使用行缓冲,以便立即输出行。

tail -f access_log | grep --line-buffered "/index.php" | while read x ; do echo -ne '\007' $x '\n' ; done

您还可以将grepandwhile循环组合成一个awk调用:

tail -f access_log | awk '/\/index.php/ { print "\007" $0 }'
于 2013-05-01T17:05:56.153 回答
7

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

于 2013-05-01T17:05:54.390 回答