在perl中拆分和过滤linux命令的输出

时间:2014-10-10 23:58:31

标签: linux perl awk

我创建了一个在PABX系统上运行的perl脚本,该系统返回SIP中继的状态。我是perl的新手,想要使用以下命令的输出

创建脚本
/usr/sbin/asterisk -rx "sip show registry"

返回以下输出

Host            dnsmgr   Username     Refresh  State        Reg.Time                 
x.x.x.x:5060    N        02xxxxxxxx   105      Registered   Thu, 28 Aug 2014 06:34:21
1 SIP registrations.

我想过滤用户名字段并获取状态字段,我可以使用以下命令在命令行轻松完成此操作,但无法在perl中找到最佳方法。这也是最佳实践,使用perl函数或将数据传递回grep和awk等程序?

/usr/sbin/asterisk -rx "sip show registry" | awk '/02xxxxxxxx/ {print $5}'

返回state列中的任何内容,在此示例中返回

Registered

然后我想比较if语句中的状态并根据状态执行一个动作,但这一点似乎很容易。

在此示例中,只有1个SIP中继,但可能有很多。

1 个答案:

答案 0 :(得分:4)

使用Perl函数更快,更容易调试。

open my $AST, '-|', '/usr/sbin/asterisk', '-rx', 'sip show registry' or die $!;
while (<$AST>) {
    print +(split)[4], "\n" if /02xxxxxx/;
}

或者,更详细一点:

open my $AST, '-|', '/usr/sbin/asterisk', '-rx', 'sip show registry' or die $!;
while (my $line = <$AST>) {
    if ($line =~ /02xxxxxx/) {
        my @items = split ' ', $line;
        print $items[4], "\n" ;
    }
}

了解更多: openprintsplitPerl syntax