File: log-grep-recent

package info (click to toggle)
spamassassin 4.0.2-2
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 22,988 kB
  • sloc: perl: 88,863; ansic: 5,193; sh: 3,737; javascript: 339; sql: 295; makefile: 209; python: 49
file content (88 lines) | stat: -rwxr-xr-x 2,355 bytes parent folder | download | duplicates (4)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
#!/usr/bin/perl
#
# log-grep-recent - select only recent messages from a mass-check log
#                   [optionally only select messages with set=x]


                                                        sub usage { die "

usage: log-grep-recent --months num_months [--set x] < full.log > recent.log

                                                        \n"; }

# <@LICENSE>
# Licensed to the Apache Software Foundation (ASF) under one or more
# contributor license agreements.  See the NOTICE file distributed with
# this work for additional information regarding copyright ownership.
# The ASF licenses this file to you under the Apache License, Version 2.0
# (the "License"); you may not use this file except in compliance with
# the License.  You may obtain a copy of the License at:
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
# </@LICENSE>

use strict;
use warnings;

my $months = 0;
my $set;
use Getopt::Long qw(:config bundling auto_help);
GetOptions(
           "m|months=f" => \$months,
           "s|set=f"    => \$set
         ) or usage();

usage() unless ($months > 0);

my $roughly1month = (24 * 60 * 60 * 30);
my $now = time;
my $cutoff = $now - (($roughly1month * $months) + ($roughly1month - 1));

my %buckets = ();

while (<>) {
  if (/^[Y\.]\s+-?\d+.*?\btime=(\d+)\b.*?\bset=(\d)\b/) {
    my $t = $1;
    my $s = $2;

    if (defined $set && $set != $s) {
      next;
    }

    my $monthsago = int (($now - $t) / $roughly1month);
    $buckets{$monthsago}++;

    if ($t >= $cutoff) {
      print;
    } else {
      next;
    }
  }
  elsif (/^#/) {
    next;           # comments
  }
  else {
    warn "unparseable line: $_";
  }
}

my $numtotal = 0;
foreach my $m (keys %buckets) {
  $numtotal += $buckets{$m};
}

warn "Month distribution:\n\n";
my $cumul = 0;
foreach my $m (sort { $a <=> $b } keys %buckets) {
  $cumul += $buckets{$m};
  warn sprintf ("%8d (%3d%%)  %8d  %2d-%d months old\n",
            $cumul, int(($cumul / ($numtotal||0.001)) * 100),
            $buckets{$m}, $m, $m+1);
}