在Perl脚本中使用awk命令

时间:2014-06-24 11:14:26

标签: perl

这可能不是下面的最佳方式,所以任何评论都表示赞赏。

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

我想要做的是突出显示不同的讯息[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的引用,这是Perl翻译的一个问题。这会是人们的首选吗?

1 个答案:

答案 0 :(得分:1)

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

我对a2p没有多少经验,而是倾向于手工翻译这些片段。

#!/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在评论中所说,更优雅的解决方案是使用CPAN的Tailing模块,而不是将tail作为子进程调用。但对于一个可能过度的快速工具。

注意:如果$ArchiverLog来自您无法控制的任何地方,请记得清理它,否则您将创建一个很好的安全漏洞。