【问题标题】:Untangling an interleaved log (text) file解开交错的日志(文本)文件
【发布时间】:2019-01-12 14:59:30
【问题描述】:

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

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

我想解开这一切,因为所有的滴答声都是连续的,我确信如果繁琐的 Perl 脚本可以编写一个基本的脚本来完成它 - 但有没有更简单的方法或 CPAN 库可能会有所帮助?

【问题讨论】:

  • 为清楚起见添加预期输出..您应该展示您自己的努力来解决它..

标签: regex perl text sed


【解决方案1】:

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

sed -rn "/^On tick [0-9]{8} total/ p;" yourfile

说明

  • ^ 注意我们只匹配行首
  • p 表示打印匹配行
  • 选项-n 表示没有明确的p 命令不会打印任何行
  • [0-9]{8} 正好匹配 8 位数字,我们需要选项 -r 来实现这一点

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

【讨论】:

    【解决方案2】:

    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也是没用的。
    【解决方案3】:

    sort 没什么复杂的:

    sort -k3n yourfile
    

    (3 是您希望记录排序依据的列,n 用于数字比较)

    【讨论】:

      猜你喜欢
      • 2012-03-22
      • 2015-04-26
      • 1970-01-01
      • 1970-01-01
      • 2016-01-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多