你如何在perl中使用正则表达式来获取文本的一部分

时间:2016-01-03 21:42:01

标签: regex perl

如何在文本文件中添加一行,用于重新格式化文件的外观?

所以例如在我的文字中:

Dec 27 21:49:41 osboxes NetworkManager[686]: <info>    nameserver '192.168.221.2'

我制作的正则表达式与文本匹配

  /([a-z][a-z][a-z]\s(\d\d)\s(\d\d):(\d\d):(\d\d)\s[a-z]*\s(NetworkManager).*)/ig

但你如何做到这一点,输出将是不同的,基本上重新安排,使它看起来像这样

**NetworkManager** osboxes Dec 27 21:49:41 <info>    nameserver '192.168.221.2'. [686]

2 个答案:

答案 0 :(得分:4)

对于您的用例,而不是处理所有这些正则表达式,只需使用 Parse :: Syslog 模块:它应该更加健壮和灵活,以防您需要扩展脚本。

use strict;
use warnings;
use Parse::Syslog;
my $syslogfile = "syslog.txt";
my $parser = Parse::Syslog->new( $syslogfile , allow_future => 1);
while(my $sl = $parser->next) {
 print "**$sl->{program}** $sl->{host} ".localtime($sl->{timestamp})." $sl->{text} [".$sl->{pid}."]\n"; }

答案 1 :(得分:0)

这样的事情就可以了。请注意,我们可以简化它,因为开头的日期总是15个字符。

$b = "Dec 27 21:49:41 osboxes NetworkManager[686]: <info>    nameserver '192.168.221.2'";
$b =~ m/(.{15})\s+([a-z]*)\sNetworkManager(\[\d+\]):\s+(.*)/ig;
# **NetworkManager** osboxes Dec 27 21:49:41 <info>    nameserver '192.168.221.2'. [686]
print( "**NetworkManager** $2 $1 $4 $3\n" );
# prints:
# **NetworkManager** osboxes Dec 27 21:49:41 <info>    nameserver '192.168.221.2' [686]