tee命令无法将内容输出到屏幕或文件

4
我使用以下命令查看哪些VirtualHost正在我的服务器上接收流量(也可以使用其他方法)。
 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 呢?


1
使用 which tee 命令检查你正在使用哪个 tee。确保它实际上是 tee 命令而不是其他命令。 - Tripp Kinetics
2个回答

4

对于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。)

3

您可以使用 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在stdout上,tee在stdin上),因为我们不需要为它们使用stdbuf
我会接受MicahElliot的答案,因为--line-buffered对于grep更为具体,应该在此处使用。 stdbuf是一个很好的替代方案,适用于没有提供此选项的程序(以及像我这样的家伙,在阅读grep的手册之前;))

谢谢你的建议,我用了你的方法因为我比较懒,而且也更省事;@Micah Elliott 的回答涉及到一些参数,我需要去阅读说明文档才能理解! - PeterB
1
@PeterB 顺便说一句,非常感谢你向我展示了这个好工具!我以前不知道 ngrep。太酷了!稍微搜索了一下,还发现了 netsed - 听起来也很有前途! - hek2mgl

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接