使用perl来获取使用正则表达式的信息

时间:2011-01-14 10:40:55

标签: regex perl

所有

我在Perl中运行的命令输出如下。但是,我只对捕获组件及其各自的状态感兴趣。 (即“组件”和“状态”列)

我一直在考虑如何使用正则表达式来解决这个问题。我想假设我不会真正知道组件的名称,因为将来可能会有其他组件。我不关心两个中间列(process-type或pid)。

任何建议都会有所帮助。

我的$ 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 个答案:

答案 0 :(得分:1)

您可以使用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'
    };

答案 1 :(得分:1)

假设输出的布局没有改变,组件名称没有空格,可能的状态只有'Alive'和'Down',你可以使用给定的正则表达式来匹配每一行:

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

下面,我编写了一个从STDIN获取输入的代码,并打印出组件及其状态:

while(<STDIN>) {
    if( $_ =~ /^(\S+)\s+\|.+\|\s+(Alive|Down)$/ ) {
        print "$1 -> $2\n";
    }
}