Назад | Перейти на главную страницу

Grep в огромном лог-файле (> 14 ГБ) только последние x ГБ?

Мне нужно что-то поискать в огромном лог-файле (более 14 ГБ). Я почти уверен, что это последние 4 ГБ или около того.

Есть ли способ пропустить первые X ГБ, чтобы ускорить процесс?

Я думаю, ты мог бы использовать хвостик чтобы вывести только последние 4 ГБ или около того, используя -c переключатель

-c, --bytes = [+] ЧИСЛО
вывести последние ЧИСЛО байтов; или используйте -c + NUM для вывода, начиная с байта NUM каждого файла

Вы могли бы что-нибудь сделать с дд тоже, установив bs=1 и skiping к смещению, которое вы хотите начать, например

dd if=file bs=1024k skip=12g | grep something

Я публикую это просто потому, что об этом просили некоторые комментарии.

В конечном итоге я использовал (файл размером 15 ГБ). Это сработало очень быстро и сэкономило мне массу времени.

tail -f -c 14G file | grep something

Я также провел очень элементарный тест на том же файле. Я тестировал:

grep xxx файл
// потребовалось навсегда (> 5 минут)

dd if = file bs = 1 skip = 14G | grep xxx
// очень быстро <1 сек

хвост -c 14g | grep xxx
// довольно быстро <2 сек

в tail просто немного короче.

NB: используемый суффикс g и G отличаются для каждой команды (Ubuntu 15.10)

Это не ответ на вопрос о заголовке, но он сделает то, что вы хотите. Используйте tac, чтобы перевернуть файл, затем используйте grep, чтобы найти вашу строку. Если ваша строка встречается в файле только один раз или известное количество раз, то позвольте ей работать, пока она не найдет известное количество вхождений. Таким образом, если ваше предположение о том, где он находится в файле, неверно, он все равно его найдет. Если вы действительно хотите его ограничить, вы можете использовать для этого head. Команда head будет находиться между tac и grep.

Итак, команда выглядит так:

tac < logfile | grep myString