Вам нужно выполнить несколько тестов, чтобы выяснить, где находятся ваши узкие места и как быстро работают ваши различные инструменты.Попробуйте некоторые тесты, подобные этому:
time fgrep '2064351200' example.log >/dev/null
time egrep '2064351200' example.log >/dev/null
time sed -e '/2064351200/!d' example.log >/dev/null
time awk '/2064351200/ {print}' example.log >/dev/null
Традиционно egrep должен быть самым быстрым из всех (да, быстрее, чем fgrep), но некоторые современные реализации являются адаптивными и автоматически переключаются на наиболее подходящий алгоритм поиска.Если у вас есть bmgrep (который использует алгоритм поиска Бойера-Мура), попробуйте это.Как правило, sed и awk будут работать медленнее, потому что они разработаны как более универсальные инструменты для работы с текстом, а не для конкретной задачи поиска.Но это действительно зависит от реализации, и правильный способ выяснить это - запустить тесты.Запускайте их по несколько раз, чтобы не мешать таким вещам, как кеширование и конкурирующие процессы.
Как указывал @Ron, ваш процесс поиска может быть связан с дисковым вводом / выводом.Если вы будете искать один и тот же файл журнала несколько раз, сначала может быть быстрее сжать файл журнала;это ускоряет считывание с диска, но затем требует больше процессорного времени для обработки, потому что сначала его нужно распаковать.Попробуйте что-то вроде этого:
compress -c example2.log >example2.log.Z
time zgrep '2064351200' example2.log.Z >/dev/null
gzip -c example2.log >example2.log.gz
time zgrep '2064351200' example2.log.gz >/dev/null
bzip2 -k example.log
time bzgrep '2064351200' example.log.bz2 >/dev/null
Я только что провел быстрый тест с довольно сжимаемым текстовым файлом и обнаружил, что bzip2 сжимается лучше всего, но затем потребовалось гораздо больше процессорного времени для распаковки, поэтому опция zgip завеласьбыть самым быстрым в целом.Ваш компьютер будет иметь другую производительность диска и процессора, чем у меня, поэтому ваши результаты могут отличаться.Если у вас есть другие компрессоры, попробуйте их и / или попробуйте разные уровни сжатия gzip и т. Д.
Кстати, о предварительной обработке: если вы просматриваете один и тот же журнал снова и снова, есть лиспособ предварительно выбрать только те строки журнала, которые вас могут заинтересовать?Если это так, сгруппируйте их в файл меньшего размера (возможно, сжатый), а затем выполните поиск вместо всего этого.Как и в случае со сжатием, вы тратите дополнительное время заранее, но затем каждый отдельный поиск выполняется быстрее.
Примечание о конвейерной обработке: при прочих равных условиях конвейер огромного файла с помощью нескольких команд будет медленнее, чем при использовании однойКоманда делает всю работу.Но все здесь не одинаково, и если использование нескольких команд в конвейере (что делают zgrep и bzgrep) повышает общую производительность, сделайте это.Кроме того, подумайте, действительно ли вы передаете все данные по всей трубе.В приведенном вами примере fgrep '2064351200' example.log | fgrep 'action: example'
первый fgrep отбросит большую часть файла;pipe и вторая команда должны обрабатывать только небольшую часть журнала, содержащую «2064351200», поэтому замедление, скорее всего, будет незначительным.
tl; dr ПРОВЕРИТЬ ВСЕ ВЕЩИ!
РЕДАКТИРОВАТЬ: если файл журнала «живой» (т. е. добавляются новые записи), но основная его часть статична, вы можете использовать частичный подход предварительной обработки: сжать (и, возможно, предварительно просканировать) журнал, а затем при сканировании использоватьсжатая (& / prescanned) версия плюс хвостовая часть журнала, добавленная после предварительного сканирования.Примерно так:
# Precompress:
gzip -v -c example.log >example.log.gz
compressedsize=$(gzip -l example.log.gz | awk '{if(NR==2) print $2}')
# Search the compressed file + recent additions:
{ gzip -cdfq example.log.gz; tail -c +$compressedsize example.log; } | egrep '2064351200'
Если вы собираетесь выполнить несколько связанных поисков (например, определенный запрос, затем конкретные действия с этим запросом), вы можете сохранить предварительно отсканированные версии:
# Prescan for a particular request (repeat for each request you'll be working with):
gzip -cdfq example.log.gz | egrep '2064351200' > prescan-2064351200.log
# Search the prescanned file + recent additions:
{ cat prescan-2064351200.log; tail -c +$compressedsize example.log | egrep '2064351200'; } | egrep 'action: example'