我需要一些幫助,我有一個命令的輸出,需要從輸出中只提取時間,即「10:57:09
」。如何在Perl中使用正則表達式
的命令是:tail -f /var/log/sms
命令的輸出:
Thu 2016/08/04 10:57:09 gammu-smsd[48014]: Read 0 messages
我怎麼能做到這一點的Perl和結果放入變量
謝謝
我需要一些幫助,我有一個命令的輸出,需要從輸出中只提取時間,即「10:57:09
」。如何在Perl中使用正則表達式
的命令是:tail -f /var/log/sms
命令的輸出:
Thu 2016/08/04 10:57:09 gammu-smsd[48014]: Read 0 messages
我怎麼能做到這一點的Perl和結果放入變量
謝謝
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
通常,在給出答案之前,我們希望您展示一些嘗試自己解決問題的證據。
使用匹配運算符(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';
}
}
我試過這個腳本,但它卡住..不顯示任何結果 – wael
你說得對。我的代碼太簡單了。現在修復。 –
[我應該怎麼做當有人回答我的問題?](http://stackoverflow.com/help/someone-answers)。您似乎沒有接受任何問題的答案。如果你不這樣做,最終人們會停止幫助你。 –
工程....我只是需要更多的東西怎麼coud我執行尾-f /無功/日誌/ SMS到腳本perl獲取txt? – wael
@wael:請參閱[我的答案](http://stackoverflow.com/a/38762344/7231)。但是,真的,這都是非常基本的東西。你讀過任何[Perl書籍](http://learn.perl。org/books /)或者在嘗試執行此操作之前採取了任何[Perl教程](http://perl-tutorial.org/)? –
@wael看我的編輯到anser –