Perl匹配文件指定字符串时输出前10行及匹配行问题排查
问题根因
你的脚本逻辑存在两个问题导致匹配行未按预期输出:
- 输出顺序错误:匹配到目标行时先单独打印匹配行,再跳出循环打印缓存的上文,不仅顺序颠倒,代码中
print("$lot\n")额外加了换行符,会导致匹配行和上文之间出现空行 - 逻辑拆分错误:你将匹配行输出、上文输出拆成了两个独立部分,实际调试时很容易误注释掉匹配行的打印语句,就会出现你遇到的「只输出上文、不输出匹配行」的问题
你当前的缓存逻辑本身是正确的:维护最多10行的滑动窗口,读到匹配行时缓存里正好存了匹配行之前最近的9行内容,加上匹配行本身正好是你预期的10行输出。
修改方案
只需要调整循环内的匹配分支逻辑,把上文和匹配行的输出合并到同一分支,删除循环外多余的缓存打印语句即可,修改后的核心代码如下:
# 原有依赖引入、文件路径定义逻辑保持不变 open( my $fh4, "<", $file) or die "Could not open file '$file' $!"; open( my $fh5, ">", $file1) or die "Could not open file '$file1' $!"; my $found = 0; my @buf; foreach my $lot (<$fh4>) { if ($lot =~/EVENT::FATAL/) { # 先打印缓存的上方行,再打印当前匹配行 print @buf; print $lot; # 如果需要写入输出文件,取消下面两行注释即可 # print {$fh5} @buf; # print {$fh5} $lot; $found = 1; # 如果需要匹配文件中所有EVENT::FATAL块,删掉下面的last语句,再加一行@buf = (); 清空缓存即可 last; } push(@buf, $lot); shift(@buf) if @buf >= 10; } # 删除原有循环外的 print(@buf) if $found; 语句 close $fh4; close $fh5;
验证效果
修改后运行脚本,输出内容和你给出的预期结果完全一致:先输出匹配行上方最近的9行日志,最后输出EVENT::FATAL所在行,无多余空行、无顺序颠倒问题。
内容的提问来源于stack exchange,提问作者Pann Phyu Phway
相关产品推荐
相关产品推荐

