通过管道输入 Perl 脚本

发布于 2025-01-02 07:46:28 字数 336 浏览 0 评论 0原文

我需要将某些日志条目通过管道传输到 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]  

I need to pipe certain log entries into a perl script, but I can't get it to work using ARGV or STDIN.

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

Perhaps something is being buffered but it appears nothing is making it to test3.pl, but if I leave off the | test3.pl then I see what should be going in to perl:

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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

神妖 2025-01-09 07:46:28

如果未连接到终端,awk 将默认缓冲输出。调用 fflush()system("") 在您的 awk 脚本中。

awk will buffer output by default if it's not connected to a terminal. Call fflush() or system("") in your awk script.

冷月断魂刀 2025-01-09 07:46:28

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

您需要找到一种方法来禁用 awk 的缓冲。我不知道该怎么做,但我可以提供 Perl 替代方案。

tail -f messages \
   | perl -lne'BEGIN{$|=1} /auth failure:/ && print join " ", (split)[0,1,2,9]' \
      | test3.pl

另请参阅:File::Tail

Sounds like awk performs no buffering or line buffering when connected to a terminal, and performs block buffering when connected to something other than a terminal. This is pretty standard behaviour, and it's the reason you have to pass --line-buffered to grep.

You need to find a way to disable awk's buffering. I don't know how to do that, but I can provide a Perl alternative.

tail -f messages \
   | perl -lne'BEGIN{$|=1} /auth failure:/ && print join " ", (split)[0,1,2,9]' \
      | test3.pl

See also: File::Tail.

别闹i 2025-01-09 07:46:28

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

while (<>) {
  print;
}

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

The input from the pipe will be in your STDIN. What makes you think it isn't there? You can read it using

while (<>) {
  print;
}

Also, you can do all of those steps in one simple Perl program.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文