Usando 'tac' em arquivos compactados

2

tac unzipped.log | grep -m1 pattern funciona perfeitamente, mas não consigo usar o comando tac em arquivos compactados.

tac zipped.gz | zgrep -m1 pattern não retorna nada.

Existe alguma maneira de usar tac sem descompactar meu arquivo?

    
por Ramneek 29.05.2014 / 10:16

1 resposta

5

O gzip opera como um fluxo do primeiro byte ao último byte; você não pode começar a descomprimir no meio. A maioria das ferramentas de compactação faz isso porque, se você permitir a descompactação a partir do meio, não estará aproveitando ao máximo as semelhanças entre o início e o fim. Então, para pesquisar uma string em um arquivo gzip, você precisa descompactar o arquivo inteiro de qualquer maneira (pelo menos até a primeira partida, se você estiver interessado apenas na primeira partida).

Além disso, tac inverteria as linhas, não os bytes. Como um arquivo descompactado não é dividido em linhas (elas são arquivos binários, em que uma quebra de linha é um byte como qualquer outro), isso poderia transformar o arquivo em algo inutilizável.

Você pode reverter o arquivo descompactado:

zcat zipped.gz | tac | grep -m1 pattern 

No entanto, isso não é necessariamente mais rápido do que pesquisar o arquivo inteiro, porque tac em si não é tão rápido (a maioria dos aplicativos é lida do começo ao fim, então os kernels otimizam esse caso e tac tem que testar cada byte para ver se é uma nova linha). Se você quer apenas a última linha, você pode extraí-la:

zcat zipped.gz | grep pattern | tail -n1
    
por 30.05.2014 / 03:50