perl - 命令输出中的两行到一行,我可以冻结 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
解决方案
我会这样做(这不是一个完整的脚本,只关注你的问题)
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
}
推荐阅读
- symfony - Symfony 4 - Webpack-encore 使用 FosJsRouting:路由未定义
- postman - 如何从使用“setNextRequest”创建 ID 的 POST 请求中按 ID 调用下一个 GET 请求
- r - 将时间序列数据除以每年的第一个值
- flutter - 在中心对齐列,但在 Flutter 中将文本对齐到屏幕左侧
- sql-server - 合并与删除并插入选择
- python - 如何在 bitbucket 中查看 python 文件?
- dax - DAX:如何检查 A 列中的值在 B 列中是否有 2 个不同的值?
- javascript - 图片继续在浏览器中打开而不是运行点击事件
- php - 每个自定义帖子类型文件的自定义部分
- pointers - Ifort:指针属性上的 move_alloc(),intent(in) 触发错误