开发者

use perl to get information using regexs

All,

I have the following output from a command that I run in Perl. However, I am only interested in capturing the components and their respective statuses. (I.e. the "component" and "status" columns)

I've been thinking about how to approach this using regular expressions. I would like to assume that i will not really know the names of the components as in the future there may be additional components in the column. I don't care about the two middle columns (process-type or pid).

Any suggestions would be helpful.

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

Regards,


Assuming the layout of your output doesn't change, the component name doesn't have spaces, and the possible status are only 'Alive' and 'Down', you could use the given regex to match each line:

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

Below, I wrote a code that gets the input from STDIN, and prints out the component and it's status:

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


You might be able to use opmnctl options to simplify what the Perl has to process, maybe:

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

I'd suggest using split, and split on the pipe | characters that delimit the fields.

Here's a short snippet that may give you some ideas. If you can use some opmnctl options, you'd be able to simplify this.

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 );

Result:

$VAR1 = {
      'DSA' => 'Down',
      'FTP_Servers' => 'Alive',
      'SDFW' => 'Alive',
      'serverpro' => 'Down',
      'OID' => 'Alive',
      'OXQA' => 'Alive',
      'www-daemon' => 'Alive'
    };
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜