所有
我在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
此致
答案 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";
}
}