3

このタイプのコンテンツを含むログ ファイルがあります。

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, 21および2013(このファイルは、毎日 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を含む行を配列に入れ、その日の最大数を見つける必要があります。

4

4 に答える 4

4
#!/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+マッチをより硬くすることができます。そうする価値があるかどうかは、無関係な一致のコストに依存します。(現在の正規表現の 1 つのバージョンは、5 月 99 日と 00 日、および 20130 年 5 月などを認識して、実際よりも寛大です。どちらも無効な時間を許可しています)。これらはすべて、答えに実質的な影響を与えることなく、正規表現を微調整することで修正できます。

于 2013-05-21T16:23:31.947 に答える