tee不会写入屏幕或文件

我使用以下命令查看哪些VirtualHosts在我的服务器上获得stream量(欢迎使用替代方法)。

ngrep 'Host:' port 80 -t -W byline -q | grep '^Host' 

我希望能够在一段时间内分析点击次数,同时看看发生了什么。 要做到这一点,我一直在试图写输出到一个文件,同时也显示使用三通

  ngrep 'Host:' port 80 -t -W byline -q | grep '^Host' | tee ~/hosts.log 

但是,没有什么是打印到屏幕或login到文件。

我在screen会话之外尝试了不同的文件位置 – 没有任何区别。 grep需要特殊处理吗?

ngrepgrep的部分都有缓冲行。 以下是你如何解决你所看到的问题:

 % sudo ngrep 'Host:' port 80 -t -W byline -d lo -q -l |grep --line-buffered '^Host:' |tee foo.log 

请注意, ngrep使用-l来缓存stdout行,而grep使用--line-buffered来保存相同的内容。

(我加了-d lo只是为了我自己的测试。)

您可以使用stdbuf命令,如下所示:

 ngrep 'Host:' port 80 -t -W byline -q | stdbuf -o0 grep '^Host' | tee /tmp/hosts 

我将grepstdout缓冲区设置为零。

stdbuf是一个通用的锤子,它可以用于与glibc链接的程序,因为输出/输入缓冲发生在libc中。 写入终端的程序的输出将被缓存,输出到管道或文件的程序的输出将被块缓冲 – 除非程序本身调用flush() 。 你可以使用stdbuf来修改这个行为。

顺便说一句, ngreptee似乎调用flush()ngrep的标准输出, tee在stdin),因为我们不需要使用stdbuf他们。


我会接受MicahElliot的回答,因为-line --line-buffered对于grep更具体,应该在这里使用。 stdbuf是不提供这样一个选项的程序的一个不错的选择(对于像我这样没有阅读过grep的手册页的人);)