gpt4 book ai didi

arrays - Perl:我可以使用模式匹配来查找日志文件中的某些行吗

转载 作者:行者123 更新时间:2023-12-01 11:44:25 25 4
gpt4 key购买 nike

我有一个包含此类内容的日志文件:

Mon Nov 19 11:00:01 2012
Host: myserver
accurev-ent inuse: 629


Mon Nov 19 12:00:01 2012
Host: myserver
accurev-ent inuse: 629

使用 Perl,我想出了如何删除空行并将非空行放入数组中的方法。现在我正在尝试匹配当前的月份、日期和年份。即,我试图获取所有具有 May、212013 的行(此文件是每天运行 24 次的脚本的产物天。我不需要 hh:mm:ss 数据。

我一直尝试按照以下方式进行模式匹配:

foreach $prod (@prod)
{
# Sun May 19 02:00:01 2013
if ($prod =~ ((/Sun May 19/) && $prod =~(/2013$/)) )
{
print "Howdy! \n"; # just using to indicate success
}
}

我可以通过模式匹配来做到这一点,还是应该尝试拆分它并找到数据匹配?顺便说一句,找到匹配项后,我需要将包含 inuse 的行放入一个数组中,并找到当天最大的数字。

最佳答案

#!/usr/bin/env perl
use strict;
use warnings;
use POSIX qw(strftime);

# The active regex looks for today's date
# The commented out regex looks for dates in the current month
# If you provide a suitable timestamp (seconds since the epoch),
# you can generate the pattern for an arbitrary date by changing
# time (a function call) to $timestamp.
my $pattern = strftime("%B %d \\d+:\\d+:\\d+ %Y", localtime(time));
# my $pattern = strftime("%B \\d+ \\d+:\\d+:\\d+ %Y", localtime(time));
# print "$pattern\n";
my $regex = qr/$pattern/;

# my @prod = <>;

foreach my $prod (@prod)
{
# print "Check: $prod\n";
if ($prod =~ $regex)
{
print "$prod\n";
}
}

这使用 strftime(来自 POSIX)在正确的位置创建一个包含当前月份和年份的正则表达式字符串,并处理应该包含日期和时间组件的数字字符串。然后它用 qr// 创建一个带引号的正则表达式,并将其应用于 @prod 数组中的每个条目。如果您愿意,可以使 \d+ 匹配更严格;是否值得这样做取决于无关匹配的成本。 (当前正则表达式的一个版本比它可能更宽松,识别 5 月 99 日和 00 日,以及 20130 年 5 月等;它们都允许无效时间通过)。所有这些都可以通过调整正则表达式来解决,而不会对答案产生实质性影响。

关于arrays - Perl:我可以使用模式匹配来查找日志文件中的某些行吗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16674663/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com