lê a primeira linha do arquivo .gz compactado sem descompactar o arquivo inteiro

0

Eu tenho um arquivo de log enorme compactado em formato .gz e quero apenas ler a primeira linha dele sem descompactá-lo apenas para verificar a data do log mais antigo no arquivo.

Os registros são da forma:

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.

    
por Pratik Mayekar 26.06.2018 / 14:43

4 respostas

6

A saída de zcat do piping para head -n 1 descompactará uma pequena quantidade de dados, garantindo que seja suficiente para mostrar a primeira linha, mas normalmente não mais do que alguns buffer-fulls (96 KiB em meus experimentos):

zcat logfile.gz | head -n 1

Uma vez que head tenha terminado de ler uma linha, fecha sua entrada, que fecha o canal, e zcat para depois de receber um SIGPIPE (o que acontece quando o próximo tenta gravar no tubo fechado). Você pode ver isso executando

(zcat logfile.gz; echo $? >&2) | head -n 1

Isso mostrará que zcat sai com o código 141, o que indica que parou devido a um SIGPIPE (13 + 128).

Você pode adicionar mais pós-processamento, por exemplo, com o AWK, para extrair apenas a data:

zcat logfile.gz | awk '{ print $1; exit }'
    
por 26.06.2018 / 15:05
3

Você pode limitar a quantidade de dados que alimenta para zcat (ou gzip -dc ) e, em seguida, solicitar a primeira linha:

head -c 1000 logfile.gz | zcat 2>/dev/null | head -1 | read logdate otherstuff

Ajuste o 1000 se não capturar dados suficientes para obter toda a primeira linha.

    
por 26.06.2018 / 14:58
3

Para corresponder apenas uma data da primeira linha de um arquivo compactado - zgrep solution:

zgrep -m1 -o '^[^[:space:]]*' logfile.gz

Isso gerará o primeiro YYYY-MM-DD para você.

    
por 26.06.2018 / 15:17
1

Se você quer apenas a primeira linha sem descompactar o arquivo:

gunzip -c logfile.gz | awk 'NR==1 {print; exit}'

Isso enviará os dados compactados para a saída padrão sem descompactá-los e awk imprimirá apenas a primeira linha.

    
por 26.06.2018 / 15:10