这可能不是下面的最佳方式,所以任何评论都表示赞赏。
我目前正在追踪一些日志文件并将它们输出到屏幕,以便我快速了解系统。
我想要做的是突出显示不同的讯息[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翻译的一个问题。这会是人们的首选吗?
答案 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
来自您无法控制的任何地方,请记得清理它,否则您将创建一个很好的安全漏洞。