管道进入perl脚本

时间:2012-02-03 22:21:58

标签: perl streaming real-time pipe

我需要将某些日志条目输入到perl脚本中,但是我无法使用ARGV或STDIN来使用它。

tail -f messages | grep --line-buffered "auth failure:" | awk '{print $1,$2,$3,$10}' | test3.pl

也许某些东西正在被缓冲,但似乎没有任何东西可以用于test3.pl,但是如果我放弃| test3.pl那么我会看到应该进入perl:

Feb 3 16:09:36 [user=someusername]  

3 个答案:

答案 0 :(得分:5)

如果没有连接到终端,

awk将默认缓冲输出。在fflush()脚本中调用awksystem("")

答案 1 :(得分:3)

awk连接到终端时,--line-buffered执行无缓冲或线路缓冲,并在连接到终端以外的其他设备时执行块缓冲。这是非常标准的行为,这是您必须将grep传递给awk的原因。

您需要找到一种方法来禁用tail -f messages \ | perl -lne'BEGIN{$|=1} /auth failure:/ && print join " ", (split)[0,1,2,9]' \ | test3.pl 的缓冲。我不知道该怎么做,但我可以提供Perl替代方案。

{{1}}

另请参阅:File::Tail

答案 2 :(得分:2)

来自管道的输入将位于 STDIN 中。是什么让你觉得它不存在?您可以使用

阅读它
while (<>) {
  print;
}

此外,您可以在一个简单的Perl程序中执行所有这些步骤。