動作未確認。末尾に空フィールドができるけどゴメンして。

($a,$f,$t,$k)=@ARGV;$k=~s/%([\da-f]{2})/pack H2,$1/egi;print"Content-Type: te".
"xt/",$a?"tab-separated-values\nContent-Disposition: attachment;filename=$f".($
t&&"-$t").($k&&"-$k").'.log':plain,"\n\n";sub l{localtime}$f?do{/^....(..)(..)$
/x&$1<13&$2<32&&(open(F,"$_.txt"),print grep$k?/\Q$k/o:1,<F>)for$f..$t||$f}:do{
($d,$m,$y)=(l)[3..5];open F,sprintf">>%d%02d%02d.txt",$y+1900,$m+1,$d;print F
join"\t",''.l,@ENV{REQUEST_URI,REMOTE_ADDR,HTTP_USER_AGENT,HTTP_REFERER},"\n"}