Использование команды awk внутри скрипта Perl

#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 поступает из любого места, которое вы не контролируете, не забудьте очистить его, иначе вы создаете хорошую дыру в безопасности.