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
需要特殊处理吗?
ngrep
和 grep
都有行缓冲在起作用。以下是解决您遇到的问题的方法:
% 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
我正在将 grep
的 stdout
缓冲区设置为零。
stdbuf
是一个通用的锤子,适用于链接到 glibc
的程序,因为 output/input 缓冲发生在 libc 中。写入终端的程序的输出将得到行缓冲,输出到管道或文件的程序的输出将得到块缓冲 - 除非程序本身调用 flush()
。您可以使用 stdbuf
修改此行为。
顺便说一句,ngrep
和 tee
似乎调用 flush()
(ngrep
在标准输出上,tee
在标准输入上)因为我们不需要为他们使用 stdbuf
。
我会接受 ,因为 --line-buffered
对于 grep
更具体,应该在这里使用。 stdbuf
对于不提供这种选项的程序来说是一个不错的选择(对于像我这样之前没有阅读过 grep 手册页的人来说;))
我使用以下命令查看哪些 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
需要特殊处理吗?
ngrep
和 grep
都有行缓冲在起作用。以下是解决您遇到的问题的方法:
% 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
我正在将 grep
的 stdout
缓冲区设置为零。
stdbuf
是一个通用的锤子,适用于链接到 glibc
的程序,因为 output/input 缓冲发生在 libc 中。写入终端的程序的输出将得到行缓冲,输出到管道或文件的程序的输出将得到块缓冲 - 除非程序本身调用 flush()
。您可以使用 stdbuf
修改此行为。
顺便说一句,ngrep
和 tee
似乎调用 flush()
(ngrep
在标准输出上,tee
在标准输入上)因为我们不需要为他们使用 stdbuf
。
我会接受 --line-buffered
对于 grep
更具体,应该在这里使用。 stdbuf
对于不提供这种选项的程序来说是一个不错的选择(对于像我这样之前没有阅读过 grep 手册页的人来说;))