首页 > 解决方案 > 命令输出中的两行到一行,我可以冻结 FH 吗?

问题描述

我想将此输出(见下文)存储在文件句柄或服务器上文件以外的其他东西中。我可以冻结它,然后在所需的字段上拆分,还是?欢迎采纳建议!原始输出是每条记录行,脚本输出是每条记录一行,而后者是问题所在。当每条记录有行时,我无法拆分某些文件。例如,我不想要任何包含“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

2020 年 1 月 15 日星期三 15:56:21 5308742 2949626 根停止rc S_PASWD_READ OK 检测到审计对象读取事件 /etc/security/passwd

__RAW_OUTPUT__2LINES

2020 年 1 月 15 日星期三 15:56:21 5308744 2949626 根停止rc S_PASWD_READ OK

     audit object read event detected /etc/security/passwd

标签: perl

解决方案


我会这样做(这不是一个完整的脚本,只关注你的问题)

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

   push @output, $line ;
}  

现在您可以搜索仅包含 1 行格式的 @output。如果输入在两条线段的中间结束,这也有效(尽管显然您无法搜索不存在的数据)。

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
}

推荐阅读