Eu tenho um arquivo de log enorme compactado no formato .gz e quero apenas ler a primeira linha dele sem descompactá-lo para apenas verificar a data do log mais antigo no arquivo.
Os logs são do formato:
YYYY-MM-DD Log content asnsenfvwen eaifnesinrng
YYYY-MM-DD Log content asnsenfvwen eaifnesinrng
YYYY-MM-DD Log content asnsenfvwen eaifnesinrng
Eu só quero ler a data na primeira linha que eu faria assim para um arquivo descompactado:
read logdate otherstuff < logfile.gz
echo $logdate
Usar o zcat está demorando muito.
zcat
A saída de Piping parahead -n 1
descompactará uma pequena quantidade de dados, com garantia de ser suficiente para mostrar a primeira linha, mas normalmente não mais do que alguns buffers cheios (96 KiB em meus experimentos):Depois
head
de terminar de ler uma linha, ele fecha sua entrada, o que fecha o pipe, ezcat
para depois de receber umSIGPIPE
(o que acontece quando ele tenta escrever no pipe fechado). Você pode ver isso executandoIsso mostrará que
zcat
sai com o código 141, o que indica que parou por causa de umSIGPIPE
(13 + 128).Você pode adicionar mais pós-processamento, por exemplo , com AWK, para extrair apenas a data:
(No macOS, talvez seja necessário usar
gzcat
em vez dezcat
manipular arquivos compactados com gzip.)Você pode limitar a quantidade de dados para os quais alimenta
zcat
(ougzip -dc
) e solicitar a primeira linha:Ajuste o
1000
se isso não capturar dados suficientes para obter toda a primeira linha.Para corresponder apenas a uma data da 1ª linha de um arquivo compactado -
zgrep
solução:Isso produzirá o primeiro
YYYY-MM-DD
para você.Se você quiser apenas a primeira linha sem descompactar o arquivo:
Isso enviará os dados compactados para a saída padrão sem descompactá-los e
awk
imprimirá apenas a primeira linha.