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


34

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

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


7
LC_ALL=C grepможет ускорить это.
JFS

1
Вы сможете получить большую скорость, выбрав разумное grepвыражение ... a.*thingв некоторых случаях подстановочные знаки неизвестной длины (например ) могут занять гораздо больше времени для оценки. Может случиться так, что вы оптимизируете не то, что нужно (хотя поиск в части файла не повредит, очевидно - это может быть не самым лучшим источником ускорения).
Флорис

Ответы:


75

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

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

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

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

83
После этого вы должны настроить logrotate.
Джеральд Шнайдер

3
@Rogier Пожалуйста, добавьте ответ с решением вместо того, чтобы добавить его в свой вопрос. Это похоже на самоответ: serverfault.com/help/self-answer
AL

5
@istheEnglishway: Нет, они отправили другую команду.
Легкость гонки с Моникой

11
Но ваш ответ не предоставляет фактическую команду, которая реализует это решение, что является добавленной стоимостью. Вы можете отредактировать это в своем ответе, или ОП может опубликовать его как новый ответ. Они определенно не должны добавлять это к вопросу, что и случилось. И вам определенно не следует разбрасываться эпитетами типа «тыкать носом».
Легкость гонок с Моникой

7
@istheEnglishway, верьте этому или нет, имея пример, проще, чем читать
справочную

32

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

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

tail -f -c 14G file | grep something

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

grep xxx file
// занял вечно (> 5 минут)

дд если = файл бс = 1 пропустить = 14G | grep xxx
// очень быстро <1 сек

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

tailтолько немного короче.

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


Вы очищали кеш диска между тестами? Я подозреваю, что большую часть времени в первом из них был ввод / вывод. Ускорение должно быть порядка 15х, а не 300х.
Рейд

2
@ Не знаю. Но я выполнил каждую команду несколько раз. Я уверен, что dd или tail значительно увеличат скорость по сравнению с просто grep (кеш или нет).
Роджер

19

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

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

tac < logfile | grep myString

1
Я пришел сюда, чтобы написать точно такой же ответ. Я удивлен, что никто не проголосовал против твоего.
Дмитрий Григорьев

2
Это заняло у меня минуту, но потом я застонала от каламбура ... такова противоположность кота.
Самми

1
Мне нужно было копаться в журнале приложений / отладки . Поскольку он переворачивает строки, его не становится легче читать ;-) Однако, кажется, очень быстро. Никогда не видел tac, так что спасибо!
Роджер
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.