#perl
#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
, которая является транслятором awk для Perl. Будет ли это предпочтительным выбором людей?
Комментарии:
1. Вы должны взглянуть на
File::Tail
модуль.Tail::Tool
Или является более продвинутым и позволит вам одновременно обрабатывать несколько файлов2. Пожалуйста, покажите остальную часть вашего кода на Perl, чтобы мы могли видеть, что вам нужно в контексте. И образец вашего файла журнала был бы хорош
3. Еще не дошел до изучения модулей и того, как они работают..
4. Возможно, вам стоит взглянуть? Каждый модуль отличается и имеет свою собственную документацию по CPAN , которую вы должны прочитать перед его использованием. Но большинство модулей либо предоставляют новые функции (подпрограммы), которые вы можете использовать, либо предлагают объектно-ориентированный интерфейс
Ответ №1:
Кажется безумием использовать один мощный язык сценариев для вызова другого, чтобы он мог делать то, что первый может делать очень хорошо, поэтому я бы не стал настаивать на попытке вызвать awk из perl.
У меня не было большого опыта работы с a2p, скорее я склонен просто переводить такие фрагменты вручную.
#!/usr/bin/perl
use strict;
foreach(`tail -n 5 $ArchiverLog`) {
my @f = split;
if ($f[4] =~ /DEBUG/) {
print "33[1;33m$_33[0m";
} elsif ($f[6] =~ /ERROR/) {
print "33[1;31m$_33[0m";
} else {
print $_;
}
}
(Трудно сказать, полностью ли верно приведенное выше, без какого-либо примера ввода для его проверки).
Как говорит Бородин в комментариях, более элегантным решением было бы использовать модуль Tailing из CPAN, а не вызывать tail в качестве подпроцесса. Но для быстрого инструмента это может быть излишним.
ПРИМЕЧАНИЕ: если $ArchiverLog
поступает из любого места, которое вы не контролируете, не забудьте очистить его, иначе вы создаете хорошую дыру в безопасности.