Разбор файла AIDE для подсчета строк между шаблонами - PullRequest
1 голос
/ 24 сентября 2019

ALL,

В Perl есть очень мощная функция под названием grep{} @some_var.

. Я пытаюсь изменить скрипт, чтобы использовать grep для анализа файла журнала AIDE ипосчитать количество измененных строк.

Однако по какой-то причине счетчик равен 0.

Может кто-нибудь помочь?Прошло много времени с тех пор, как я использовал Perl в производстве ...

#!/usr/bin/perl -w
use strict;
my @lines;
open( INFILE, "aide.log" ) || die "Cannot open input file for processing";
push( @lines, $_ ) while <INFILE>;
close INFILE;
my $matched;
my $count = grep { $matched == 1; $matched = 1 if $_ =~ /[-A-Za-z0-9]*(Added|Changed|Removed)/; $matched = 0 if $_ =~ /[-A-Za-z0-9]*Detail/ } @lines;
print "Number of changed files is ", $count, "!\n";

Все, что мне нужно, это посчитать количество строк между

XXX Added
XXX Changed
XXX Deleted

и

XXX Detail

Количество не должно включать эти строки.

, где XXX - просто произвольный текст.

TIA!

[EDIT]

aide.log

AIDE version xxx
Executed on 23 September 2019 05:15:00

2019-09-23T05:15:00+00 localhost Added files
2019-09-23T05:15:00+00 localhost /tmp/testfile
2019-09-23T05:15:00+00 localhost /scripts/aide-parser.pl
2019-09-23T05:15:00+00 localhost Changed files
2019-09-23T05:15:00+00 localhost /var/log/syslog
2019-09-23T05:15:00+00 localhost Deleted files
2019-09-23T05:15:00+00 localhost /scripts/aide-parser.pl.old
2019-09-23T05:15:00+00 localhost /etc/aide.conf.old
2019-09-23T05:15:00+00 localhost /etc/iptables.conf.old
2019-09-23T05:15:00+00 localhost Details of changes

Пример вывода:

Number of changed files is 6

Должны учитываться только строки с именем файла

[/ EDIT]

1 Ответ

2 голосов
/ 24 сентября 2019

Один из способов сделать это - сохранить состояние, что вы пытаетесь.

Хорошим инструментом для этого является оператор range

use warnings;
use strict;
use feature 'say';

my $file = shift or die "Usage: $0 file\n";

my $beg = qr/Added|Changed|Deleted/; 
my $end = qr/Detail/;

my $cnt;

open my $fh, '<', $file or die "Can't open $file: $!";

while (<$fh>) { 
    if (/$beg/ .. /$end/) { 
        ++$cnt unless /$end|$beg/;
    }
}

say $cnt;

Это печатает 6 для предоставленного входного файла.(Проверяется также сохранением строк в массиве и проверкой.)

Комментарии к опубликованному коду

  • grep - это фильтр, и это не очень хорошоиспользовать для этого

  • -w был заменен use warnings; в ... 2000 году?Вроде 20 лет назад.Не хочу издеваться, просто обновите

  • Используйте лексические дескрипторы файлов (open my $fh ...), а не globs (INFILE).Гораздо лучше, если это так

  • Я бы сказал, что $matched == 1; - опечатка, и она должна быть = (не ==)

  • Нет необходимости в $_ =~ //, так как оператор соответствия регулярного выражения (а также оператор подстановки) по умолчанию использует $_.Хотя возможность использования значений по умолчанию, таких как $_, может быть обсуждена, в этом случае ее пропуск явно улучшает читабельность, и это почти всегда имеет место с регулярным выражением

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...