Использование `tac` на zipped-файлах

tac unzipped.log | grep -m1 pattern tac unzipped.log | grep -m1 pattern работает отлично, но я не могу использовать команду tac для zip-файлов.

tac zipped.gz | zgrep -m1 pattern tac zipped.gz | zgrep -m1 pattern ничего не возвращает.

Есть ли способ использовать tac без разархивирования моего файла?

gzip работает как поток от первого байта до последнего байта; вы не можете начать декомпрессию посередине. Большинство инструментов сжатия делают это, потому что если вы разрешаете распаковывать с середины, то вы не используете в полной мере сходства между началом и концом. Поэтому для поиска строки в gzip-файле вам нужно все равно распаковать весь файл (по крайней мере до первого совпадения, если вас интересует только первое совпадение).

Кроме того, tac будет менять строки, а не байты. Так как декомпрессированный файл не разделяется на строки (они являются двоичными файлами, где разрыв строки является байтом, как и любой другой), это может помешать файлу во что-то непригодное.

Вы можете отменить распакованный файл:

 zcat zipped.gz | tac | grep -m1 pattern 

Однако это не обязательно быстрее, чем поиск всего файла, потому что сам tac не так быстр (большинство приложений читаются от начала до конца, поэтому ядра стремятся оптимизировать этот случай, а затем tac должен проверять каждый байт, чтобы видеть если это новая строка). Если вы хотите только последнюю строку, вы можете ее извлечь:

 zcat zipped.gz | grep pattern | tail -n1