【问题标题】:Using an awk command inside a Perl script在 Perl 脚本中使用 awk 命令
【发布时间】:2014-06-24 11:14:25
【问题描述】:

这可能不是执行以下操作的最佳方法,因此感谢任何 cmet。

我目前正在跟踪一些日志文件并将它们输出到屏幕上,以便快速了解系统。

我想做的是突出显示不同的消息[INFO][WARN][ERROR]

以下语法在命令行上运行良好,但从 Perl 调用时失败

system ("tail -n 5 $ArchiverLog | awk '{if ($4 ~ /DEBUG/)print "\033[1;33m"$0"\033[0m"; else if ($6 ~ /ERROR/) print "\033[1;31m"$0"\033[0m"; else print $0}'");

我相信 Perl 可以做到这一点

我是否应该逐行读取文件,匹配单词并打印到屏幕上(我只想要最后 10 行)。这是更好的选择吗?

我还看到了对a2p 的引用,它是一个 awk 到 Perl 的翻译器。那会是人们的首选吗?

【问题讨论】:

  • 你应该看看File::Tail 模块。或者Tail::Tool 更高级,可以让你同时跟踪多个文件
  • 请显示您的 Perl 代码的其余部分,以便我们可以在上下文中看到您需要的内容。你的日志文件的样本会很好
  • 还没有学习模块以及它们是如何工作的......
  • 或许你应该看看?每个模块都是不同的,并且在CPAN 上都有自己的文档,您必须在使用它之前阅读这些文档。但大多数模块要么提供你可以使用的新功能(子程序),要么提供面向对象的接口

标签: perl


【解决方案1】:

使用一种强大的脚本语言来调用另一种脚本语言似乎很疯狂,这样它就可以完成第一种语言可以做得很好的事情,所以我不会坚持尝试从 perl 调用 awk。

我对 a2p 没有太多经验,我倾向于手动翻译这样的 sn-ps。

#!/usr/bin/perl
use strict;
foreach(`tail -n 5 $ArchiverLog`) {
        my @f = split;
        if ($f[4] =~ /DEBUG/) {
                print "\033[1;33m$_\033[0m";
        } elsif ($f[6] =~ /ERROR/) {
                print "\033[1;31m$_\033[0m";
        }  else {
                print $_;
        }
}

(如果没有一些样本输入进行测试,很难说上述是否完全正确)。

正如 Borodin 在 cmets 中所说,一个更优雅的解决方案是使用 CPAN 中的 Tailing 模块,而不是将 tail 作为子进程调用。但是对于一个可能有点矫枉过正的快速工具。

注意:如果 $ArchiverLog 来自您无法控制的任何地方,请记住对其进行清理,否则您正在制造一个很好的安全漏洞。

【讨论】:

    猜你喜欢
    • 2016-11-22
    • 1970-01-01
    • 1970-01-01
    • 2018-08-28
    • 1970-01-01
    • 2017-01-13
    • 2020-07-09
    • 2014-04-29
    • 1970-01-01
    相关资源
    最近更新 更多