Как сделать / grep / awk последними N байтами файла, а не строками

13

У меня есть приложение, которое ведет журнал в текстовом файле журнала (myapp.log), но, похоже, оно не записывает символы новой строки в конце каждой записи журнала. Если я выполняю команду, как tail -n 50 myapp.logя на самом деле получаю сотни «строк» ​​текста (записи журнала).

Этот файл журнала очень большой, примерно 1 ГБ, который знает, как давно был вставлен последний CR и / или LF. Как я могу просто сказать, например, последние 2 МБ?

jwbensley
источник

Ответы:

26

Используя -cпереключатель (2MB = 2 * 1024 * 1024 = 2097152 байта):

tail -c 2097152 myapp.log

Спасибо Петру Узелу за предложение. Некоторые реализации хвоста позволяют добавить модуль для печати последних килобайт (k) или мегабайт (m), например:

tail -c 2m myapp.log

Однако обратите внимание, что он не является стандартным (ни в одном из POSIX, UNIX (SUS) или Linux (LSB)) и не переносим. Также обратите внимание, что, поскольку термины «мега» / «килограмм» ... и их сокращения (M, k ...) имеют неоднозначные значения (1000 против 1024), нет большой гарантии того, что та или иная реализация tailбудет означать под 2m(хотя текущие версии текущих реализаций, которые поддерживают его, похоже, подходят для варианта 1024).

Birei
источник
5
Хвост должен иметь возможность принимать число с единицами в качестве аргумента для переключателя c, поэтому он tail -c 2M myapp.logтакже должен работать.
Петр Узел
@PetrUzel: Спасибо. Отредактировал ответ, чтобы добавить его.
Бирей
Теперь я чувствую себя глупо :) Спасибо за оперативность, очень ценю это. Отличное предложение!
Jwbensley
1
Отлично, не уверен, поможет ли это, но я добавлю эту текстовую строку, потому что это то, что я искал по ключевым словам, чтобы найти здесь (потребовалось много времени): "данные файла cat между двумя позициями байтов (не строки) "
Torxed