Regex 解开交错的日志(文本)文件

Regex 解开交错的日志(文本)文件,regex,perl,text,sed,Regex,Perl,Text,Sed,我有一个以下格式的纯文本文件: On tick 95479102 total blocks 65 On tick 95479103 total blocks 66 On tick 95479104 total blocks 66 On tick 95479105 total blocks 66 On tick 95479106 total blocks 67 On tick 95479107 total blocks 67 On tick 95479108 total blocks 67 On

我有一个以下格式的纯文本文件:

On tick 95479102 total blocks 65
On tick 95479103 total blocks 66
On tick 95479104 total blocks 66
On tick 95479105 total blocks 66
On tick 95479106 total blocks 67
On tick 95479107 total blocks 67
On tick 95479108 total blocks 67
On tick 95479109 total blocks 67
On tick 95479110 total blocks 67
On tick 95479111 total blocks 67
On tick 95479112 total blocks 67
On tick 95479113 total blocks 68
On tick 95479114 total blocks 68
On tick 95479115 total blocks 68
On tick 95479116 total blocks 68
由于操作员错误,一些其他日志与此混合在一起,因此现在有如下稍后的日志条目:

On tick 95479541 total blocks 69
On tick 385 total blocks 124
On tick 130 total blocks 124
On tick 95479542 total blocks 69
On tick 386 total blocks 124
On tick 131 total blocks 124
On tick 95479543 total blocks 69
On tick 387 total blocks 124
On tick 388 total blocks 124
On tick 95479544 total blocks 69
On tick 132 total blocks 124
On tick 95479545 total blocks 69
sed -rn "/^On tick [0-9]{8} total/ p;" yourfile
我想把所有这些都解开,因为所有的记号都是顺序的,我确信可以编写一个基本的、但很麻烦的Perl脚本来完成它——但是有没有更简单的方法或CPAN库可以帮助我?

没有什么复杂的:


(3是您希望记录按其排序的列,对于数字比较,
n

Perl一行应该足以过滤噪声

cat file.log | perl -e 'my $last; while(<>) { /On tick (\d+) total blocks \d+/; if (!$last || int($1) == $last+1) { print "$_"; $last = int($1) }; }'
cat file.log | perl-e'my$last;while()

请注意,脚本假定文件中的第一个记号是有效的。

您可以使用
sed
筛选“On tick”和“total”之间正好有8位数字的行,如下所示:

On tick 95479541 total blocks 69
On tick 385 total blocks 124
On tick 130 total blocks 124
On tick 95479542 total blocks 69
On tick 386 total blocks 124
On tick 131 total blocks 124
On tick 95479543 total blocks 69
On tick 387 total blocks 124
On tick 388 total blocks 124
On tick 95479544 total blocks 69
On tick 132 total blocks 124
On tick 95479545 total blocks 69
sed -rn "/^On tick [0-9]{8} total/ p;" yourfile
解释

  • ^
    注意我们只在一行的开头匹配
  • p
    表示打印匹配行
  • 选项
    -n
    意味着如果没有明确的
    p
    命令,就不会打印任何行
  • [0-9]{8}
    正好匹配8位数字,我们需要选项
    -r

当您对输出感到满意时,可以将命令输出存储在另一个文件中。

为清晰起见,添加预期输出。。你需要展示你自己的努力来解决它……这是对“一条线”概念的延伸!这也是对猫的无用使用。