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

标签 arrays perl pattern-matching

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

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/

相关文章:

arrays - const 结构成员的 typedef 中的灵活数组大小

php - 如何找到数组的第一个,第二个,第三个等数字

java - 如何在Java中减去两个列表/数组的值?

R:有效地确定一个数组的哪些切片在一秒内出现

正则表达式捕获特定单词之间的单词

perl - 如何使用 require 从 Exporter Perl 模块导入符号?

android - 声学指纹识别背后的原理是什么?

perl - 将十六进制字符串转换为二进制

regex - 字符串模式匹配问题

java - 用值列表替换字符串中的模式 (SQL)