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

时间:2015-10-25 19:04:13

标签: 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 /控制台上生成的输出如下所示:

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. 重定向到文件:
  2. 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:
    2. 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了解不多,但在我看来这似乎是一个缓冲问题 - 但不确定呢?任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:6)

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

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

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

VS

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