created: 2022-04-11T07:33:41.642Z

ログファイルを正規表現で複数ファイルに分割するスクリプト

こんな感じのログファイル、テストファイルごとのログに分割したい時のスクリプト

[12:34:56] t/test/index.t
[1364,"Field 'id' doesn't have a default value"]
[1364,"Field 'name' doesn't have a default value"]
[12:34:56] t/test/util.t
[1292,"Truncated incorrect DOUBLE value: 'IN'"]
[1292,"Truncated incorrect DOUBLE value: 'IN'"]

csplit コマンドで似たようがことができるが、テストファイルの名前をキャプチャしたかったのでスクリプトを書くことになった。

  • /tmp/_ にディレクトリを置いておく必要がある
  • if文のあたりを直せば、他のケースでもファイル分割という同様のことができるはず
#!/usr/bin/env perl
use feature 'say';
use strict;
use warnings;

my $matched;
my $out = 0;
open my $fh, ">", "/tmp/_/$out";
while (<>) {
    chomp;
    if (/^\[\d{2}:\d{2}:\d{2}\] (t\S+)/) {
        close $fh;
        $matched = $1;
        $out++;
        open $fh, ">", "/tmp/_/$out";
        say $fh "$matched\n";
    } else {
        say $fh $_;
    }
}

参考

なお、csplitコマンドはmacOS版がLinux版とオプションがちょっと違う。