从Perl中的命令输出查询第二行

时间:2019-05-30 19:57:57

标签: perl

我需要在输出中看到的第二行进行查询。我需要检查命令是否在“ 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

1 个答案:

答案 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)的顺序,以便最重要的支票优先。