
У меня много сжатых gz-файлов журналов с общими именами, и мне нужно проверить период времени, который они отражают. Я знаю о zcat | head, но это работает только для начала файла.
Как мне получить только последнюю строку, не распаковывая весь файл?
решение1
Если вам нужны строки из конца файла, а не из его начала, используйте tail
вместо head
:
$ zcat /var/log/syslog.2.gz | tail -1
Aug 24 07:09:02 myhost rsyslogd: [origin software="rsyslogd" swVersion="8.4.2" x-pid="796" x-info="http://www.rsyslog.com"] rsyslogd was HUPed
решение2
FWIW: Я разработал инструмент командной строки, который может создавать хвост ( -t
) или даже непрерывный хвост gzip-файла ( -T
) по мере его роста. (Доступно много других опций):
https://github.com/circulosmeos/gztool
Итак, в вашем случае:
$ gztool -t myfile.gz | tail -1
Обратите внимание, что для любого из этих действий gztool
будет создан небольшой (<1%/gzip) индексный файл, перемежающийся с этим действием.Преимущество этого способа в том, что все последующие «хвосты» или извлечения из этого файла практически не будут потреблять время/ресурсы процессора, поскольку файл не распаковывается заново полностью!