tee 不写入屏幕或文件

tee doesn't write to screen or file

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

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

我希望能够分析一个时间间隔内的点击次数,同时还能看到发生了什么。为此,我一直在尝试将输出写入文件,同时还使用 tee 显示它。

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

但是,没有任何内容打印到屏幕或记录到文件。

我在 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 的程序,因为 output/input 缓冲发生在 libc 中。写入终端的程序的输出将得到行缓冲,输出到管道或文件的程序的输出将得到块缓冲 - 除非程序本身调用 flush()。您可以使用 stdbuf 修改此行为。

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


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