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

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

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

34
задан 31 January 2017 в 22:06
3 ответа

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

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

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

dd if=file bs=1024k skip=12g | grep something
75
ответ дан 28 November 2019 в 19:52

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

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

tail -f -c 14G file | grep something

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

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

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

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

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

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

32
ответ дан 28 November 2019 в 19:52

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

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

tac < logfile | grep myString
19
ответ дан 28 November 2019 в 19:52

Теги

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