2016-08-04 47 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)。您似乎沒有接受任何問題的答案。如果你不這樣做,最終人們會停止幫助你。 –