прочитайте первую строку из сжатого .gz файла без распаковки всего файла

Я придумал это решение, и оно у меня работает.

echo print `top -n 1 | tr -s " " | cut -d$" " -f10 | tail -n +8 | head -n -1 | paste -sd+ | bc`/ `nproc` | python

Источник (написать): https://mohammadg.com/programming/how-to-get-overall-cpu-utilization-from-the-bash-command-line/

9
26.06.2018, 16:05
4 ответа

Если вам нужна только первая строка без распаковки файла:

gunzip -c logfile.gz | awk 'NR==1 {print; exit}'

Это отправит сжатые данные на стандартный вывод без их распаковки, а awkнапечатает только первую строку.

1
27.01.2020, 20:04

Чтобы просто сопоставить дату из 1-й строки заархивированного файла-zgrepрешение:

zgrep -m1 -o '^[^[:space:]]*' logfile.gz

Это выведет первый YYYY-MM-DDдля вас.

3
27.01.2020, 20:04

Вы можете ограничить объем передаваемых данных доzcat(или gzip -dc), а затем запросить первую строку:

head -c 1000 logfile.gz | zcat 2>/dev/null | head -1 | read logdate otherstuff

Отрегулируйте 1000, если при этом недостаточно данных для получения всей первой строки.

4
27.01.2020, 20:04

Передача вывода zcatв head -n 1будет распаковывать небольшой объем данных, гарантированно достаточный для отображения первой строки, но обычно не более нескольких заполнений буфера -(96 КиБ в мои эксперименты):

zcat logfile.gz | head -n 1

После того, как headзакончил чтение одной строки, он закрывает свой ввод, что закрывает канал, и zcatостанавливается после получения SIGPIPE(, что происходит при следующей попытке записи в закрытый канал ). Вы можете увидеть это, запустив

(zcat logfile.gz; echo $? >&2) | head -n 1

Это покажет, что zcatзавершается с кодом 141, что указывает на остановку из-заSIGPIPE(13 + 128 ).

Вы можете добавить больше пост-обработки -, , например. с помощью AWK, чтобы извлечь только дату:

zcat logfile.gz | awk '{ print $1; exit }'

(В macOS вам может понадобиться использовать gzcat, а не zcatдля обработки файлов, сжатых gzip.)

38
27.01.2020, 20:04

Теги

Похожие вопросы