在perl中执行regex时,如何在数组中找到与文本文件中的关键字匹配的内容



我不知道如何匹配关键字文本中的关键字,这些关键字是:

NetworkManager
dhclient
dbus

我的代码目前看起来是这样的:

#!/usr/bin/perl
use strict;
use warnings;
use File::Compare;
my $syslogFile = 'syslog';
open (my $syslogInfo, '<', $syslogFile) or die "Could not open $syslogFile";
my $keywordFile = 'keyword';
open (my $keywordInfo, '<', $keywordFile) or die "Could not open $keywordFile";
while(my @keywordArray = <$keywordInfo>)
{
    print "@keywordArrayn";
}

while(my @syslogLine = <$syslogInfo>)
{
    print "@syslogLinen";
}

现在我陷入了如何让这两个文本文件协同工作并获得所需结果的困境。

我想做的是在我的syslog txt中保存一些东西,例如:

Dec 27 21:17:52 osboxes rsyslogd: [origin software="rsyslogd" swVersion="8.12.0" x-pid="695" x-info="http://www.rsyslog.com"] rsyslogd was HUPed
Dec 27 21:18:05 osboxes anacron[634]: Job `cron.daily' terminated
Dec 27 21:18:05 osboxes anacron[634]: Normal exit (1 job run)
Dec 27 21:22:29 osboxes NetworkManager[686]: <info>    lease time 1800
Dec 27 21:22:29 osboxes NetworkManager[686]: <info>    domain name 'localdomain'

将其与关键字匹配,并只打印包含关键字的行,以便只打印:

Dec 27 21:22:29 osboxes NetworkManager[686]: <info>    lease time 1800
Dec 27 21:22:29 osboxes NetworkManager[686]: <info>    domain name 'localdomain'

我已经尝试过通过这样做来使用IF:

if(my @syslogLine = (/^[a-zA-Z][a-zA-Z][a-zA-Z]s(dd)s(dd):(dd):(dd)s[a-zA-Z]*s(@keywordArray).*/s))
{
    open(outputFile, ">>output");
    print outputFile "@syslogLinen";
}

但这给了我错误:

Possible unintended of @keywordArray
Global symbol "@keywordArray requires explict package name

我猜perl不喜欢在regex中有一个数组?我就是想不通这个问题。

常见的方法是根据关键字构建正则表达式,然后读取第二个文件,并根据关键字匹配每一行:

#!/usr/bin/perl
use warnings;
use strict;
my $keywordFile = 'keyword';
open my $KW, '<', $keywordFile or die "Could not open $keywordFile";
chomp( my @keywords = <$KW> );
my $regex = join '|', map quotemeta, @keywords;
my $syslogFile = 'syslog';
open my $SYS, '<', $syslogFile or die "Could not open $syslogFile";
while(<$SYS>) {
    print if /$regex/;
}

最新更新