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版とオプションがちょっと違う。

怒られの作法 ――日本一トラブルに巻き込まれる編集者の人間関係術 (単行本)
[ad] 怒られの作法 ――日本一トラブルに巻き込まれる編集者の人間関係術 (単行本)
草下 シンヤ (単行本(ソフトカバー))