2016-08-04 28 views
0

我需要一些帮助,我有一个命令的输出,需要从输出中只提取时间,即“10:57:09”。如何在Perl中使用正则表达式

的命令是:tail -f /var/log/sms

命令的输出:

Thu 2016/08/04 10:57:09 gammu-smsd[48014]: Read 0 messages 

我怎么能做到这一点的Perl和结果放入变量

谢谢

回答

0

Perl代码:

$txt = "Thu 2016/08/04 10:57:09 gammu-smsd[48014]: Read 0 messages"; 
$txt =~ /(\d{2}:\d{2}:\d{2})/; 
print $1; # result of regex 
print "\n"; # new line 

而且它打印:

10:57:09 

结果变成了一个名为$1变量,由于捕获括号。曾经有过更多的捕捉圆括号其捕获文本将不得不把INT $2$3等等

编辑

要阅读从控制台行,在上面的脚本中使用:

$txt = <STDIN>; 

现在,假设脚本被称为myscript.pl,执行tail像这样:

tail -f /var/log/sms | myscript.pl 
+0

工程....我只是需要更多的东西怎么coud我执行尾-f /无功/日志/ SMS到脚本perl获取txt? – wael

+0

@wael:请参阅[我的答案](http://stackoverflow.com/a/38762344/7231)。但是,真的,这都是非常基本的东西。你读过任何[Perl书籍](http://learn.perl。org/books /)或者在尝试执行此操作之前采取了任何[Perl教程](http://perl-tutorial.org/)? –

+0

@wael看我的编辑到anser –

0

通常,在给出答案之前,我们希望您展示一些尝试自己解决问题的证据。

使用匹配运算符(m/.../)检查字符串是否与正则表达式匹配。 m经常被忽略,所以你会看到它写作/.../。默认情况下,它与变量$_匹配,但可以使用绑定运算符=~更改该值。如果正则表达式包含圆括号((...)),那么与该正则表达式的该部分匹配的任何内容都将存储在$1(和$2$3等中,以便用于后面的括号组)。在列表上下文中评估时,匹配操作符也返回那些“捕获”值。

检查匹配运算符的返回值总是一个好主意,因为如果匹配不成功,您几乎肯定会采取不同的操作。

有关匹配运算符的更多详细信息,请参阅perldoc perlop,有关Perl的正则表达式支持的更多详细信息,请参阅perldoc perlre

#!/usr/bin/perl 

use strict; 
use warnings; 
use 5.010; 

$_ = 'Thu 2016/08/04 10:57:09 gammu-smsd[48014]: Read 0 messages'; 

if (my ($time) = /(\d\d:\d\d:\d\d)/) { 
    say "Time is '$time'"; 
} else { 
    say 'No time found in string'; 
} 

并充分利用您的外部处理数据......

#!/usr/bin/perl 

use strict; 
use warnings; 
use 5.010; 

open my $tail_fh, 'tail -f /var/log/sms |' or die $!; 
while (<$tail_fh>) { 
    if (my ($time) = /(\d\d:\d\d:\d\d)/) { 
    say "Time is '$time'"; 
    } else { 
    say 'No time found in string'; 
    } 
} 
+0

我试过这个脚本,但它卡住..不显示任何结果 – wael

+0

你说得对。我的代码太简单了。现在修复。 –

+1

[我应该怎么做当有人回答我的问题?](http://stackoverflow.com/help/someone-answers)。您似乎没有接受任何问题的答案。如果你不这样做,最终人们会停止帮助你。 –