Мне нужно что-то поискать в огромном лог-файле (более 14 ГБ). Я почти уверен, что это последние 4 ГБ или около того.
Есть ли способ пропустить первые X ГБ, чтобы ускорить процесс?
Я думаю, ты мог бы использовать хвостик чтобы вывести только последние 4 ГБ или около того, используя -c
переключатель
-c, --bytes = [+] ЧИСЛО
вывести последние ЧИСЛО байтов; или используйте -c + NUM для вывода, начиная с байта NUM каждого файла
Вы могли бы что-нибудь сделать с дд тоже, установив bs=1
и skip
ing к смещению, которое вы хотите начать, например
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