используйте perl для получения информации с помощью регулярных выражений - PullRequest
1 голос
/ 14 января 2011

All

У меня есть следующий вывод команды, которую я запускаю в Perl. Однако меня интересует только сбор компонентов и их соответствующих статусов. (Т.е. столбцы "компонент" и "статус")

Я думал о том, как подойти к этому с помощью регулярных выражений. Я хотел бы предположить, что я не буду знать имена компонентов, так как в будущем в столбце могут быть дополнительные компоненты. Меня не волнуют две средние колонки (тип процесса или pid).

Любые предложения будут полезны.

my $ consoleStatus = opmnctl status 2>&1;

-------------------+--------------------+---------+---------
component          | process-type       |     pid | status
-------------------+--------------------+---------+---------
serverpro          | logloaderd         |     N/A | Down
www-daemon         | www-daemon         |   10000 | Alive
OXQA               | oqa                |   99894 | Alive
SDFW               | OC4X_SECURITY      |   27683 | Alive
FTP_Servers        | HTTP_Server        |   21252 | Alive
OID                | OID                |   27207 | Alive
DSA                | DSA                |     N/A | Down

С уважением,

Ответы [ 2 ]

1 голос
/ 14 января 2011

Предполагая, что компоновка вашего вывода не изменяется, имя компонента не имеет пробелов, а возможные состояния - только «Живой» и «Вниз», вы можете использовать данное регулярное выражение для соответствия каждой строке:

/^(\S+)\s+\|.+\|\s+(Alive|Down)$/

Ниже я написал код, который получает входные данные от STDIN и распечатывает компонент и его статус:

while(<STDIN>) {
    if( $_ =~ /^(\S+)\s+\|.+\|\s+(Alive|Down)$/ ) {
        print "$1 -> $2\n";
    }
}
1 голос
/ 14 января 2011

Вы можете использовать opmnctl options , чтобы упростить то, что должен обрабатывать Perl, возможно:

opmnctl status -noheaders -fsep '|' -fmt %cmp%sta

Я бы предложил использовать split и разделить на трубе | символов, которые разделяют поля.

Вот короткий фрагмент, который может дать вам некоторые идеи. Если вы можете использовать некоторые опции opmnctl, вы сможете упростить это.

use strict;
use warnings;

use Data::Dumper;

my %component_status;

LINE: for ( split( /\n/, $consoleStatus ) ) {
    # Skip the furniture in the opmnctl output
    next LINE if m/^component\W/ || m/^-/;

    # field 0 is the component, field 3 the status.
    my ( $component, $status ) = (split( / +\| */, $_ ))[0,3];

    $component_status{$component} = $status;
}

warn Dumper( \%component_status );

Результат:

$VAR1 = {
      'DSA' => 'Down',
      'FTP_Servers' => 'Alive',
      'SDFW' => 'Alive',
      'serverpro' => 'Down',
      'OID' => 'Alive',
      'OXQA' => 'Alive',
      'www-daemon' => 'Alive'
    };
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...