圧縮ファイルに `tac`を使用する

圧縮ファイルに `tac`を使用する

tac unzipped.log | grep -m1 patterntacうまくいきますが、圧縮ファイルにはコマンドを使用できません。

tac zipped.gz | zgrep -m1 pattern何も返しません。

tacファイルを解凍せずに使用できる方法はありますか?

答え1

gzipは最初のバイトから最後のバイトまでストリームとして機能します。途中から解凍できません。ほとんどの圧縮ツールは、途中から解凍を許可すると開始と終了の間の類似性を最大限に活用できないため、これを行います。したがって、gzipで圧縮されたファイルから文字列を取得するには、とにかくファイル全体を解凍する必要があります(興味がある場合は少なくとも最初の一致まで)。

また、tac行はバイトではなく反転されます。解凍されたファイルは行に分割されていないため(他のファイルのように改行文字が1バイトのバイナリファイルです)、これによりファイルが使用できなくなります。

解凍したファイルを元に戻すことができます。

zcat zipped.gz | tac | grep -m1 pattern 

しかし、これはファイル全体を検索するよりも必ずしも高速ではありません。tacそれ自体はそれほど高速ではないからです(ほとんどのアプリケーションは最初から最後まで読み取るので、カーネルはこの場合を最適化する傾向があります。その後、各バイトをtacテストして改行文字です)。最後の行だけが必要な場合は抽出できます。

zcat zipped.gz | grep pattern | tail -n1

関連情報