две строки в одну строку в выводе команды, могу ли я заморозить FH? - PullRequest
0 голосов
/ 17 января 2020

Я хочу сохранить этот вывод, см. Ниже, в дескрипторе файла или в файле, отличном от файла на сервере. Можно ли заморозить его, затем разделить на нужные поля или? Пожалуйста, примите совет! Необработанный вывод - две строки на запись, вывод сценария - одна строка на запись, и в этом заключается проблема. Я не могу разбить некоторые поля, когда в записи есть две строки. Например, мне не нужна строка, содержащая 'root S_PASWD_READ', поэтому я пытаюсь разбить поля 8 и 10, но с двумя строками это, очевидно, не работает. Спасибо!

use strict;
use warnings;

my $stream = qq(/data/auditpr/stream.out);
my @tmp;


open my $FH, "+<", $stream or die $!;

while ((my $ln = <$FH>)) {
    $ln =~ s/\-+//g;
    $ln =~ s/\n/ / unless $a++ % 2;  ## MAKE IT PRETTY 1 LINE.
    #push @tmp, split(/\s+/, $ln);
}

__ Script_OUTPUT__1LINE

Ср 15 января 15:56:21 2020 5308742 2949626 root останавливается c S_PASWD_READ ОК обнаружено событие чтения объекта аудита / etc / security / passwd

__ RAW_OUTPUT__2LINES

Ср 15 января, 15:56:21 2020 5308744 2949626 root Stopr c S_PASWD_READ OK

     audit object read event detected /etc/security/passwd

1 Ответ

3 голосов
/ 17 января 2020

Я бы сделал это так (это не полный скрипт, фокусирующийся только на вашем вопросе)

my @output ;
while ( my $line = <$FH> ) {
   chomp $line ;
   if ( my $line2 = <$FH> ) { 
      chomp $line2 ;
      $line .= " $line2" ; 
   }

   push @output, $line ;
}  

Теперь вы можете искать через @output, который содержит только 1-строчный формат. Это также работает, если ввод заканчивается в середине двухстрочного сегмента (хотя, очевидно, вы не можете искать данные, которых там нет).

while my $search (@output) {
    my @fields = split(' ',$search) ; 
    if ( $fields[8] =~ m/something/ and $fields[10] =~ m/something/) { next } ;  # skip lines you don't want
    # do something here with the output
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...