Como posso descompactar e imprimir as últimas linhas de um arquivo de texto compactado?

2

Eu tenho 6 arquivos de texto compactados, cada um com ~ 17G quando compactado. Eu preciso ver as últimas linhas (descompactadas) de cada arquivo para verificar se existe um problema específico. A abordagem óbvia é muito lenta:

for i in *; do zcat "$i" | tail -n3; done

Eu estava pensando que poderia fazer algo inteligente como:

for i in *; do tail -n 30 "$i" | gunzip | tail -n 4 ; done

Ou

for i in *; do tac "$i" | head -100 | gunzip | tac | tail -n3; done

Mas ambos reclamam:

gzip: stdin: not in gzip format

Achei que era porque estava faltando o cabeçalho gzip , mas isso também falha:

$ aa=$(head -c 300 file.gz)
$ bb=$(tail -c 300 file.gz)
$ printf '%s%s' "$aa" "$bb" | gunzip
gzip: stdin: unexpected end of file

O que realmente estou procurando é um ztail ou ztac , mas não acho que eles existam. Alguém pode criar um truque inteligente que me permita descompactar e imprimir as últimas linhas de um arquivo compactado sem descompactar tudo?

    
por terdon 28.06.2016 / 12:17

1 resposta

5

Você não pode, já que já foi dito , se os arquivos foram compactados com o padrão gzip . Se você tiver controle sobre a compactação, poderá usar dictzip para compactar os arquivos, compactando os arquivos em blocos separados e você pode descompactar apenas o último bloco (normalmente 64KB). E é retrocompatível com gzip , o que significa que o arquivo dictzip é também um arquivo gzipado legal.

Outra possibilidade seria se você obtivesse o arquivo gzipado como uma concatenação de vários arquivos já gzipados, você poderia procurar a última assinatura gzip e descomprimir tudo depois disso.

    
por 28.06.2016 / 17:04