我需要在输出中看到的第二行进行查询。我需要检查命令是否在“ Listener LISTENER is running on”上返回并提供所需的输出。我的代码能够读取我需要验证的第一行而不是第二行。请指教。
srvctl status listener
Listener LISTENER is enabled
Listener LISTENER is running on node(s): XYZ
我尝试更新代码以读取第二行,但没有用。
my $cmd="srvctl status listener";
my $listenerstatus0;
my $msg0;
my $msg1;
open(Row1Stat,"$cmd |") || die ("Could not read the pipe\n");
$listenerstatus0 = <Row1Stat>;
close(Row1Stat);
while (<>){
if( $listenerstatus0 =~ m/Listener LISTENER is running/)
{
$msg0="LISTENER is running";
$msg1=1
}
elsif ($listenerstatus0 =~ m/Listener LISTENER is not running/) {
$msg0 = "LISTENER is not running";
$msg1 = 0;
}
else {
$msg0 = "Unable to Query LISTENER Status";
$msg1 = 0;
}
}
print "\nStatistic.Name1:$msg1";
print "\nMessage.Name1:$msg0";
我应该能够读取XYZ节点上正在运行的监听器LISTENER
答案 0 :(得分:1)
您仅从管道读取第一行。您要么需要循环(while <Row1Stat>) { ... }
)一次读取所有行,要么一次读取全部管道内容,例如,通过local $/ = undef;
清除input record separator(通过默认换行符。
这是一个循环阅读的示例。我已经删除了管道,使其成为“最小的完整可验证示例”,因为实际上srvctl
命令并不是必需的。
use strict;
use warnings;
my $msg0 = "not running";
my $msg1 = 0;
while (<DATA>) {
if (m/Listener LISTENER is running/) {
$msg0 = "is running";
$msg1 = 1;
}
elsif (m/Listener LISTENER is enabled/) {
$msg0 = "is enabled";
$msg1 = 2;
}
}
print "Statistic.Name1:$msg1\n";
print "Message.Name1:$msg0\n";
__DATA__
srvctl status listener
Listener LISTENER is enabled
Listener LISTENER is running on node(s): XYZ
您不能使用else
块来设置“未运行”,因为您正在逐行阅读并且不想以后覆盖已找到的行。因此,我在声明变量时对此进行了初始化。
现在用于确定整个管道输出并对其进行处理:
use strict;
use warnings;
my $msg0;
my $msg1;
local $/ = undef;
my $data = <DATA>;
if ($data =~ m/Listener LISTENER is running/) {
$msg0 = "is running";
$msg1 = 1;
}
elsif ($data =~ m/Listener LISTENER is enabled/) {
$msg0 = "is enabled";
$msg1 = 2;
}
else {
my $msg0 = "not running";
my $msg1 = 0;
}
print "Statistic.Name1:$msg1\n";
print "Message.Name1:$msg0\n";
__DATA__
srvctl status listener
Listener LISTENER is enabled
Listener LISTENER is running on node(s): XYZ
在两种情况下,您都需要决定哪一行(“ LISTENER已启用”或“ LISTENER正在运行”)对您来说更重要。逐行读取时,请添加一条检查,以确保您不会用不太重要的消息覆盖变量。食时,请调整支票(if
s)的顺序,以便最重要的支票优先。