bash - 无法将 perl 脚本的输出重定向到文件

标签 bash perl shell diamond-operator

尽管这个问题听起来很愚蠢,但我还是坚持了下来。 Ubuntu 14.04CentOS 6.3 都会出现上述问题。

我正在使用一个名为 netbps 的 perl 脚本,正如在答案中发布的那样(来自 RedGrittyBrick):https://superuser.com/questions/356907/how-to-get-real-time-network-statistics-in-linux-with-kb-mb-bytes-format-and-for

上面的脚本基本上采用 tcpdump(我们不需要在这里了解其详细信息的命令)的输出,并以不同的格式表示它。请注意,脚本以流模式执行此操作(即,输出是动态生成的)。

因此,我的命令如下所示:

tcpdump -i eth0 -l -e -n "src portrange 22-233333 or dst portrange 22-23333"2>&1 | ./netbps.prl

在 shell/console 上产生的输出看起来像这样:

13:52:09      47.86 Bps
13:52:20     517.54 Bps
13:52:30     222.59 Bps
13:52:41    4111.77 Bps

我正在尝试将此输出捕获到一个文件中,但是,我无法这样做。我尝试了以下方法:

  1. 重定向到文件:

tcpdump -i eth0 -l -e -n "src portrange 22-233333 or dst portrange 22-23333"2>&1 | ./netbps.prl > out.out 2>&1

这会创建一个空的 out.out 文件。 shell/控制台上没有输出。

  1. 管道和 grep:

tcpdump -i eth0 -l -e -n "src portrange 22-233333 or dst portrange 22-23333"2>&1 | ./netbps.prl 2>&1 | grep“Bps”

shell/控制台上没有输出。

我不太了解 perl,但在我看来这像是一个缓冲问题——虽然不确定?任何帮助将不胜感激。

最佳答案

这是一个缓冲问题。将行 STDOUT->autoflush(1) 添加到 netbps,它将起作用。

STDOUT 通常是行缓冲的,所以 printf 末尾的换行符应该触发缓冲区刷新,但是因为它被重定向到一个文件,所以它像任何普通文件一样被缓冲文件。你可以看到这个...

$ perl -e 'while(1) { print "foo\n"; sleep 5; }'

对比

$ perl -e 'while(1) { print "foo\n"; sleep 5; }' > test.out

关于bash - 无法将 perl 脚本的输出重定向到文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33333790/

相关文章:

bash - 在 vim 中打开某些文件类型之前如何发出警告?

Perl Inline::C 在失败时返回 pdl 或 0

bash - 删除所有早于 X 天的文件,但至少保留 Y 最年轻的文件

python - OSX Automator 无法使用 shell 中的模块运行 Python 脚本

linux - 无法在 shell 脚本中使用变量进行比较

java - java的image magick问题

bash - Shell 脚本源 : Not Found

regex - 如何在模式文件上调用 grep?

c++ - Linux 中的性能数据收集(API)

perl - 如何在 Perl 中创建列式输出?