Perl загружает строку в массив с рядом регулярных выражений - PullRequest
0 голосов
/ 04 ноября 2011

Итак, у меня есть этот файл журнала - он очень длинный.
Все, что мне действительно нужно загрузить в массив, это строки от end\s'\w+'\soutput до SUCCESS.
Я хочу загрузить массив с информацией между этими двумя параметрами и выкачать имя (пример SENDALLLINES) последнего указанного времени (пример 07:13:56) и номер (пример 399).
Я понятия не имею, как заставить массив перестать загружаться в строке, содержащей SUCCESS, чтобы я мог манипулировать информацией.

end 'SENDALLMARKETS' output
07:13:46 /data/noc/startup/send_spin.sh successfully spun out SENDALLMARKETS
07:13:46 /data/noc/startup/send_spins.sh Sleeping for 5 seconds so system can catch up.
07:13:51 /data/noc/startup/send_spin.sh pats0028/PSX_TRMASTER sending spin SENDALLLINES
07:13:51 /data/noc/startup/send_spin.sh start 'SENDALLLINES' output:
SUCCESS: Line Range spins sequenced to core stream

end 'SENDALLLINES' output
07:13:51 /data/noc/startup/send_spin.sh successfully spun out SENDALLLINES
07:13:51 /data/noc/startup/send_spins.sh Sleeping for 5 seconds so system can catch up.
07:13:56 /data/noc/startup/send_spins.sh finished sending spins
07:13:56 /data/noc/startup/check_tradereporters.sh all trade reporting lines are     connected and logged in
07:13:56 /data/noc/startup/send_spins.sh pats0010/SPINMASTER sending spins S    ENDALLACCOUNTS SENDALLFIRMS SENDALLAIQ SENDALLSTOCKS SENDALLATTRIBUTABLE
07:13:56 /data/noc/startup/send_spin.sh pats0010/SPINMASTER sending spin  SENDALLACCOUNTS
07:13:56 /data/noc/startup/send_spin.sh start 'SENDALLACCOUNTS' output:
SUCCESS: 399 account record(s) sent

end 'SENDALLACCOUNTS' output
07:13:56 /data/noc/startup/send_spin.sh successfully spun out SENDALLACCOUNTS
07:13:56 /data/noc/startup/send_spins.sh Sleeping for 5 seconds so system can catch up.
07:14:01 /data/noc/startup/send_spin.sh pats0010/SPINMASTER sending spin SENDALLFIRMS
07:14:02 /data/noc/startup/send_spin.sh start 'SENDALLFIRMS' output:
SUCCESS: 1488 firm record(s) sent

Это все, что у меня есть

#!/usr/bin/perl 
use warnings;
use strict;

my $LogDir = "/home/shortcasper/perl/work_perl_short/";
my $logFile = "initstart";
my @Log_array;
open ( my $FILE, '<', "$LogDir$logFile") or die ("could not open the file -- $!")
while (<$FILE>) {   
        my $line = $_;
        next if ($line =~ /^$/);
        if ($line =~ /end\s\'\w+\'\soutput/) {
                push (@Log_array, $line);
        }
        foreach my $logLine(@Log_array){
                print $logLine;
        }
        @Log_array = ();
}

Ответы [ 2 ]

3 голосов
/ 04 ноября 2011

Оператор дальности - ваш друг.

Предполагается, что Perl & ge; 5.10, что-то вроде

while (my $line = readline $FILE) {
    if ($line =~ /end\s'(\w+)'\soutput/ ... $line =~ /SUCCESS/) {
        $name //= $1;
        push @lines, $line;
    } elsif (defined $name) {
        say "Got $#lines for $name";
        undef $name;
        @lines = ();
    }
}
2 голосов
/ 04 ноября 2011

Это то, что вы хотите?

#!/usr/bin/perl
use strict;
use warnings;

my ($name, $time, $count);
while(<DATA>) {
    chomp;
    if (/^end '(.+?)'/) {
        $name = $1;
    } elsif (/^SUCCESS: (\w+)/) {
        $count = $1;
        $count = 0 if ($count =~ /^\D+$/);
        print "name: $name, time: $time, count: $count\n";
    } else {
        ($time) = $_ =~ /^(\d\d:\d\d:\d\d)/;
    }
}

__DATA__
end 'SENDALLMARKETS' output
07:13:46 /data/noc/startup/send_spin.sh successfully spun out SENDALLMARKETS
07:13:46 /data/noc/startup/send_spins.sh Sleeping for 5 seconds so system can catch up.
07:13:51 /data/noc/startup/send_spin.sh pats0028/PSX_TRMASTER sending spin SENDALLLINES
07:13:51 /data/noc/startup/send_spin.sh start 'SENDALLLINES' output:
SUCCESS: Line Range spins sequenced to core stream

end 'SENDALLLINES' output
07:13:51 /data/noc/startup/send_spin.sh successfully spun out SENDALLLINES
07:13:51 /data/noc/startup/send_spins.sh Sleeping for 5 seconds so system can catch up.
07:13:56 /data/noc/startup/send_spins.sh finished sending spins
07:13:56 /data/noc/startup/check_tradereporters.sh all trade reporting lines are     connected and logged in
07:13:56 /data/noc/startup/send_spins.sh pats0010/SPINMASTER sending spins S    ENDALLACCOUNTS SENDALLFIRMS SENDALLAIQ SENDALLSTOCKS SENDALLATTRIBUTABLE
07:13:56 /data/noc/startup/send_spin.sh pats0010/SPINMASTER sending spin  SENDALLACCOUNTS
07:13:56 /data/noc/startup/send_spin.sh start 'SENDALLACCOUNTS' output:
SUCCESS: 399 account record(s) sent

end 'SENDALLACCOUNTS' output
07:13:56 /data/noc/startup/send_spin.sh successfully spun out SENDALLACCOUNTS
07:13:56 /data/noc/startup/send_spins.sh Sleeping for 5 seconds so system can catch up.
07:14:01 /data/noc/startup/send_spin.sh pats0010/SPINMASTER sending spin SENDALLFIRMS
07:14:02 /data/noc/startup/send_spin.sh start 'SENDALLFIRMS' output:
SUCCESS: 1488 firm record(s) sent

вывод:

name: SENDALLMARKETS, time: 07:13:51, count: 0
name: SENDALLLINES, time: 07:13:56, count: 399
name: SENDALLACCOUNTS, time: 07:14:02, count: 1488
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...