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-e
a 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 comandodate
reformata a data. Por exemplo:$ date -d "Sep 1, 2016 1:00:01 AM" +%Y_%m_%d 2016_09_01
O
chomp
remove a nova linha final do resultado dedate
, para que possamos usá-la mais tarde. -
$name="$d.log"
: salvamos o resultado do comandodate
mais.log
como a variável$name
. -
open(my $fh,">>","$name");
: abra o arquivo$name
como 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áfoo
em$name
. -
print $fh $_;
: imprime a linha atual no arquivo para o qual o identificador de arquivo$fh
aponta. Então, imprima a linha no que quer que esteja atualmente salvo como$name
.