sandster
sandster

Reputation: 31

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,

Upvotes: 1

Views: 136

Answers (2)

martin clayton
martin clayton

Reputation: 78105

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'
    };

Upvotes: 1

Alexandre
Alexandre

Reputation: 1026

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";
    }
}

Upvotes: 1

Related Questions