このPHPをありがたく使わせてもらってたところ、apache/nginxのアクセスログをtsv形式に変換する | akamist blog
巨大ログファイル(100MB超)で正常動作しなかったので改造した。
log2tsv.php
<?php
$regex = '/^(.*?) (.*?) (.*?) \[(.*?)\] "(.*?) (.*?) (.*?)" (.*?) (.*?) "(.*?)" "(.*?)"/';
while (($line = fgets(STDIN)) !== false)
{
preg_match($regex, $line, $matches);
echo implode("\t", array_slice($matches,1)).PHP_EOL;
}
実行
$ php log2tsv.php < access.log > access.log.tsv
ヨシ!
なおPerlならワンライナーだった。
perl -lne '@f = /^(.*?) (.*?) (.*?) \[(.*?)\] "(.*?) (.*?) (.*?)" (.*?) (.*?) "(.*?)" "(.*?)"/o; print join("\t", @f)' access.log > access.log.tsv
Apacheのcombined形式のアクセスログから必要なフィールドを抽出するためのPerlのワンライナー – そうだ車輪と名づけよう 7th
そしてこのPHPとPerlを比べるとPerlの方が2倍以上は速いみたい。(PHP 7.2.29 vs Perl 5.10.1 / CentOS 6.10)
うーんPHPはarray_slice()をやめてもそんなに速くならないし・・preg_match()が遅いのかな・・?
Perlすごい・・!