Seu problema é que você está ramificando para a instrução else
antes de passar pela instrução if
, portanto, você está usando a variável splitline
antes da atribuição, como indicado nos comentários. Do jeito que eu vejo, a única razão pela qual você está usando o awk aqui é extrair a data e redirecionar para um arquivo diferente sempre que a hora ou a data forem incrementadas. Seu código só funcionaria se você tiver certeza de que a primeira linha do seu log é sempre um timestamp, mas parece que não é o caso. Você precisa começar a fazer o registro no primeiro registro de data e hora que encontrar. Para isso, proponho a você este simples ajuste no seu awk
snippet:
awk 'BEGIN{ date_found=0 }
/^# Time/ { date_found=1 }
date_found == 0 { continue }
date_found == 1 {
split($4, h, ":");
hour=h[1];
date=$3
splitfile="mysql-slow.log-split-"date"-"hour".txt";
date_found=2
}
{print $0 >> splitfile}' "$slowlog"
Desvantagem para este método: você não armazenará o conteúdo do log antes do primeiro timestamp do grande arquivo de log! Se você deseja armazenar as linhas antes do primeiro registro de data e hora no primeiro arquivo dividido, é necessário extrair a data antes de executar a chamada principal do awk. É um pouco mais complicado, mas você pode fazer isso:
first_date=$(awk '/^# Time/{print $3" "$4; exit}' "$slowlog")
awk -v init_date="$first_date" '
BEGIN{
split(init_date, a, " ")
date=a[1]
split(a[2], b, ":")
hour=b[1]
}
/^# Time/ {
split($4, h, ":");
hour=h[1];
date=$3
}
{
splitfile="mysql-slow.log-split-"date"-"hour".txt";
print $0 >> splitfile
}' "$slowlog"
Ambas as soluções devem atender às necessidades expressas na pergunta. Não hesite em fazer perguntas sobre o código, se precisar.