Что такое goaccess? это не стандартная команда, ни функция, которую Вы уже определили, необходимо объявить это в начале или получить файл, который имеет функцию
grep, скорее всего, будет быстрее:
# time awk '/USAGE/' imapd.log.1 | wc -l
73832
real 0m2.756s
user 0m2.740s
sys 0m0.020s
# time grep 'USAGE' imapd.log.1 | wc -l
73832
real 0m0.110s
user 0m0.100s
sys 0m0.030s
awk является интерпретируемым языком программирования, где, поскольку grep является скомпилированной программой c-кода (который дополнительно оптимизирован к нахождению шаблонов в файлах).
(Отметьте - я выполнил обе команды дважды так, чтобы кэширование потенциально не скашивало результаты),
Больше деталей об интерпретируемых языках на Википедию.
Как Stephane справедливо указал в комментариях, Ваш пробег может варьироваться из-за реализации grep и awk, который Вы используете, операционная система, это идет и набор символов, который Вы обрабатываете.
Используйте самый определенный и выразительный инструмент. Инструмент, что лучшие соответствия Ваш вариант использования, вероятно, будут самыми быстрыми.
Как грубое руководство:
perl
вместо awk
. если Вам нужно что-то более сложное, чем grep/cut/sed, то возможности являются awk, не будет достаточно, и Вам нужно что-то "полноценный"
– sds
28.08.2013, 17:34
Только ища строки и вопросы скорости, необходимо почти всегда использовать grep
. Это - порядки величины быстрее, чем awk
когда дело доходит до просто грубого поиска.
получите функциональные различия и различия в производительности sed, awk и других утилит парсинга Unix
UTILITY OPERATION TYPE EXECUTION TIME CHARACTERS PROCESSED PER SECOND
(10 ITERATIONS)
------- -------------- --------------- -------------------------------
grep search only 41 sec. 489.3 million
sed search & replace 4 min. 4 sec. 82.1 million
awk search & replace 4 min. 46 sec. 69.8 million
Python search & replace 4 min. 50 sec. 69.0 million
PHP search & replace 15 min. 44 sec. 21.2 million
В то время как я согласовываю это в теории grep
должно быть быстрее, чем awk
, на практике, YMMV, поскольку это во многом зависит от реализации, которую Вы используете.
здесь выдерживая сравнение busybox 1.20.0's grep и awk, GNU grep 2.14, mawk 1.3.3, GNU awk 4.0.1 на Debian/Linux 7.0 amd64 (с glibc 2.17) в локали UTF-8 на файле 240 МБ 2.5M строки символов только для ASCII.
$ time busybox grep error error | wc -l
331003
busybox grep error error 8.31s user 0.12s system 99% cpu 8.450 total
wc -l 0.07s user 0.11s system 2% cpu 8.448 total
$ time busybox awk /error/ error | wc -l
331003
busybox awk /error/ error 2.39s user 0.84s system 98% cpu 3.265 total
wc -l 0.12s user 1.23s system 41% cpu 3.264 total
$ time grep error error | wc -l
331003
grep error error 0.80s user 0.10s system 99% cpu 0.914 total
wc -l 0.00s user 0.11s system 12% cpu 0.913 total
$ time mawk /error/ error | wc -l
330803
mawk /error/ error 0.54s user 0.13s system 91% cpu 0.732 total
wc -l 0.03s user 0.08s system 14% cpu 0.731 total
$ time gawk /error/ error | wc -l
331003
gawk /error/ error 1.37s user 0.12s system 99% cpu 1.494 total
wc -l 0.04s user 0.07s system 7% cpu 1.492 total
$ time
В локали C только GNU grep получает значительное повышение и становится быстрее, чем mawk
.
Набор данных, тип regexp может также иметь большое значение. Для regexps, awk
должен сравниться grep -E
как awk
regexps расширяются REs.
Для этого набора данных, awk
могло быть быстрее, чем grep
на busybox основывал системы или системы где mawk
значение по умолчанию awk
и локаль по умолчанию является базирующимся UTF-8 (IIRC, это раньше имело место в Ubuntu).
Короче говоря grep
делает одну вещь только как многие другие инструменты UNIX, и это соответствует строке к данному шаблону, и это делает это хорошо. С другой стороны, awk
более сложный инструмент, как это - полный язык программирования, определенный стандартом POSIX с типичными функциями как переменные, массивы, выражения, функции, или проверьте утверждения для сканирования шаблона и обработки.
По-моему, это зависит от реализации, как оба инструмента работают в случае сопоставления с образцом, и на размере некоторого входа Вы хотите обработать. Я ожидал бы, что grep обычно более эффективен, чем awk, поскольку он делает соответствие только. Но Вы не можете написать с grep простой код для выполнения более сложных задач как последующая обработка подобранных записей, вычисление или печатающие результаты, не используя другие инструменты.
Используйте awk всякий раз, когда вы обнаружите, что передаёте greps, sed, sort, uniq и тому подобное. Поэтому вместо
grep <...> | sed <...> | sort <...> | cut <...> | head <...>
вы должны написать
awk -e <...>
, у которого есть все эти инструменты, и (, предположительно, ), будут работать лучше, чем разветвление подоболочек и исполняемых файлов с конвейерами.