如何在文本文件中添加一行,用于重新格式化文件的外观?
所以例如在我的文字中:
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]
答案 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]