Uma solução perl , aproveitando o GNU date para converter as datas:
perl -ne 'if(/^###<(.*)>/){
chomp($d='date -d \"$1\" +%Y_%m_%d');
$name="$d.log"
}
open(my $fh,">>","$name");
print $fh $_;' file.log
Explicação
-
-ne: leia o arquivo de entrada linha a linha (salvando cada linha como a variável especial$_) e aplique o script dado por-ea cada linha. -
if(/^###<(.*)>/): se a linha começar com###<, capture tudo entre<>as$1(é o que os parênteses fazem). -
chomp($d=date -d \ "$ 1 \" +% Y_% m_% d);: o comandodatereformata a data. Por exemplo:$ date -d "Sep 1, 2016 1:00:01 AM" +%Y_%m_%d 2016_09_01O
chompremove a nova linha final do resultado dedate, para que possamos usá-la mais tarde. -
$name="$d.log": salvamos o resultado do comandodatemais.logcomo a variável$name. -
open(my $fh,">>","$name");: abra o arquivo$namecomo o identificador de arquivo$fh. Não se preocupe se você não souber o que é um manipulador de arquivos, isso significa apenas queprint $fh "foo"imprimiráfooem$name. -
print $fh $_;: imprime a linha atual no arquivo para o qual o identificador de arquivo$fhaponta. Então, imprima a linha no que quer que esteja atualmente salvo como$name.