2014-10-10 47 views
1

我正在创建一个perl脚本,以便在返回SIP中继线状态的PABX系统上运行。我很新的Perl和想从下面的命令创建一个使用输出脚本在perl中分割和过滤linux命令的输出

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

返回无论在状态栏,在这个例子中,它返回

Registered 

然后,我想如果语句状态比较的和执行取决于状态的行动,这一点似乎虽然很容易。

在这个例子中,只有一个SIP中继,但可能有很多。

回答

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

+0

您是否能够将上述代码分解为拆分,打印和if语句等关键组件,而不是优化的单行版本,这将有助于我更好地理解。谢谢 – 2014-10-12 00:34:35

+0

@MattPrice:检查更新。 – choroba 2014-10-12 08:59:17

+0

@choroba你知道perl的这个多参数形式是什么版本的吗?似乎它不在5.12中,而是在5.18中。另外,你能否简要解释一下这些好处?我相信我已经知道一些好处,但会感谢您的体验。 – Miller 2014-10-16 21:04:56