Используя grep по сравнению с awk

Что такое goaccess? это не стандартная команда, ни функция, которую Вы уже определили, необходимо объявить это в начале или получить файл, который имеет функцию

17
19.08.2018, 09:54
6 ответов

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, который Вы используете, операционная система, это идет и набор символов, который Вы обрабатываете.

26
27.01.2020, 19:46
  • 1
    Не говоря, какой grep или awk реализацию Вы используете и на том, какая архитектура ЭВМ, и с которым системным набором символов, те синхронизации имеют мало значения. –  Stéphane Chazelas 28.08.2013, 14:59
  • 2
    вторая команда будет также использовать недавно кэшированную версию. Я не сомневаюсь, что grep более быстр, но не так как Ваше шоу чисел. –  exussum 28.08.2013, 15:18
  • 3
    (следовательно работающий awk, grep, awk, grep и отправляющий результаты второго набора awk и grep :) и к вашему сведению, я живу в локали UTF8. –  Drav Sloan 28.08.2013, 15:58
  • 4
    Достаточно забавный, с инструментами BSD (на Mac), awk (31,74 с) немного быстрее, чем sed (33,34 с), который немного быстрее, чем grep (34,21 с). Гну awk владеет ими всеми в 5,24 с, у меня нет гну grep или sed для тестирования. –  Kevin 28.08.2013, 17:25

Используйте самый определенный и выразительный инструмент. Инструмент, что лучшие соответствия Ваш вариант использования, вероятно, будут самыми быстрыми.

Как грубое руководство:

  • поиск строк, соответствующих подстроке или regexp? Используйте grep.
  • выбор определенных столбцов из просто разграниченного файла? Используйте сокращение.
  • при выполнении основанных на шаблоне замен или... другой материал sed может обоснованно сделать? Используйте sed.
  • нужны некоторая комбинация вышеупомянутых 3, или форматирование printf, или циклы общего назначения и ответвления? Используйте awk.
14
27.01.2020, 19:46
  • 1
    +1 кроме использования perl вместо awk. если Вам нужно что-то более сложное, чем grep/cut/sed, то возможности являются awk, не будет достаточно, и Вам нужно что-то "полноценный" –  sds 28.08.2013, 17:34
  • 2
    @sds, почему не Python вместо этого –  RetroCode 23.09.2016, 21:45
  • 3
    @RetroCode: Python является большим количеством "общей цели", чем жемчуг; эквивалентная острота, вероятно, будет намного длиннее. –  sds 23.09.2016, 22:48

Только ища строки и вопросы скорости, необходимо почти всегда использовать 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
10
27.01.2020, 19:46
  • 1
    Спасибо за этот хороший обзор всех этих программ. Это действительно проливает свет в темноте. –  holasz 28.08.2013, 13:53
  • 2
    ~headtilt ~ PHP идет там, но Perl не? –  Izkata 28.08.2013, 14:34
  • 3
    @Izkata - Я думал то же самое, когда я видел эту таблицу только что. –  slm♦ 28.08.2013, 14:52
  • 4
    Не действительно справедливо к другому utils, что grep просто ищет, и они также заменяют. –  Kevin 28.08.2013, 16:57

В то время как я согласовываю это в теории 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 как awkregexps расширяются REs.

Для этого набора данных, awk могло быть быстрее, чем grep на busybox основывал системы или системы где mawk значение по умолчанию awk и локаль по умолчанию является базирующимся UTF-8 (IIRC, это раньше имело место в Ubuntu).

5
27.01.2020, 19:46

Короче говоря grep делает одну вещь только как многие другие инструменты UNIX, и это соответствует строке к данному шаблону, и это делает это хорошо. С другой стороны, awk более сложный инструмент, как это - полный язык программирования, определенный стандартом POSIX с типичными функциями как переменные, массивы, выражения, функции, или проверьте утверждения для сканирования шаблона и обработки.

По-моему, это зависит от реализации, как оба инструмента работают в случае сопоставления с образцом, и на размере некоторого входа Вы хотите обработать. Я ожидал бы, что grep обычно более эффективен, чем awk, поскольку он делает соответствие только. Но Вы не можете написать с grep простой код для выполнения более сложных задач как последующая обработка подобранных записей, вычисление или печатающие результаты, не используя другие инструменты.

2
27.01.2020, 19:46

Используйте awk всякий раз, когда вы обнаружите, что передаёте greps, sed, sort, uniq и тому подобное. Поэтому вместо

grep <...> | sed <...> | sort <...> | cut <...> | head <...>

вы должны написать

awk -e <...> 

, у которого есть все эти инструменты, и (, предположительно, ), будут работать лучше, чем разветвление подоболочек и исполняемых файлов с конвейерами.

0
22.09.2021, 09:48

Теги

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