【问题标题】:tee doesn't write to screen or filetee 不写入屏幕或文件
【发布时间】:2015-10-28 15:14:36
【问题描述】:

我使用以下命令查看哪些 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 需要特殊处理吗?

【问题讨论】:

标签: linux tee


【解决方案1】:

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 只是为了我自己的测试。)

【讨论】:

    【解决方案2】:

    您可以使用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 在标准输入上),因为我们不需要为它们使用stdbuf


    我会接受MicahElliot's answer,因为--line-buffered 更适合grep,应该在这里使用。 stdbuf 是不提供此类选项的程序的不错选择(对于像我这样以前没有阅读 grep 手册页的人;))

    【讨论】:

    • 感谢您推荐接受哪个 :) 我用了你的,因为我很懒而且打字少;我需要阅读 @Micah Elliott 答案的手册页以了解这些标志!
    • @PeterB 顺便说一句,非常感谢您向我展示了那个不错的工具!我以前不知道ngrep。凉爽的!稍作搜索也给了我netsed - 这听起来也很有希望!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-10-10
    • 1970-01-01
    • 2012-04-20
    • 2012-03-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多