Использование grep или awk

Для захвата определенного шаблона можно использовать awk и grep . Почему мы должны использовать один над другим. Как это работает в фоновом режиме? Что быстрее и почему? Например

Если бы у меня был файл журнала, и я хотел захватить определенный шаблон, я мог бы сделать одно из следующих

 awk '/pattern/' /var/log/messages 

или

 grep 'pattern' /var/log/messages 

Я не делал никаких следов, поэтому не знал бы. Может кто-нибудь это уточнить?

5 Solutions collect form web for “Использование grep или awk”

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

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

Как пример:

  • поиск строк, соответствующих подстроке или регулярному выражению? Используйте grep.
  • выбирая определенные столбцы из файла с просто разделителем? Используйте разрез.
  • выполнение подстановок на основе шаблонов или … другие вещи, которые могут разумно сделать? Используйте sed.
  • нужна некоторая комбинация вышеприведенного 3 или форматирования printf, или контуров общего назначения и ветвей? Используйте awk.

Когда вы ищете только строки и скорость, вы всегда должны использовать grep . Это на порядок быстрее, чем awk когда дело доходит до грубого поиска.

source . Функциональные и служебные отличия в утилитах 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 делает одну вещь только как и многие другие инструменты UNIX, и это соответствует строке для данного шаблона, и это хорошо. С другой стороны, awk является более сложным инструментом, поскольку он представляет собой полный язык программирования, определенный стандартом POSIX, с типичными функциями, такими как переменные, массивы, выражения, функции или управляющие операторы для сканирования и обработки паттерна.

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

Хотя я согласен с тем, что теоретически grep должен быть быстрее awk , на практике YMMV, поскольку это сильно зависит от используемой вами реализации.

здесь сравниваются grep и awk busybox 1.20.0, 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,5 М строк Только символы 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 .

Набор данных, тип регулярного выражения также может иметь большое значение. Для регулярных выражений awk следует сравнивать с grep -E поскольку awk выражения awk расширены RE.

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

  • SED - поиск и замена специальными символами (#,,%)
  • Извлечь данные из строки и добавить к линии?
  • синтаксис grep для поиска строк с одиночными кавычками?
  • Что значит \? среднее значение в регулярном выражении?
  • Сравните два файла и распечатайте общие поля и их соответствующие номера строк в 1-м файле
  • Подсчет количества строк, имеющих число больше 100
  • Поиск Grep, возвращающий другую строку
  • Как сгладить журналы для списка шаблонов и сделать из него отчет?
  • Считайте уникальные строки только для заданного шаблона
  • Как извлечь конкретное поле из строк из файла на основе соответствия последующих строк
  • grep, чтобы увидеть, заканчивается ли строка определенной строкой
  • Interesting Posts

    Когда я не должен убивать -9 процесс?

    Могу ли я увидеть, что происходит в сеансе tmux без привязки к нему?

    Найти приложение по умолчанию с помощью xdg-open

    Больше не может монтировать файловые системы Windows (с 9 мая 2017 года)

    Как синхронизировать закладки (избранное) между Google Chrome и Chromium

    Выберите добавленные строки из файла

    Устанавливается ImageMagick7-7.0.1.5 на FreeBSD 10.3, но после установки команды `import` нет

    Каковы последствия, если таковые имеются, приоритетов планировщика и политик для потоков в неподготовленном cpuset?

    Как подключиться к Интернету автоматически, без ручного запуска `ethtool` каждый раз

    Добавление «случайной числовой энтропии» для ключей GPG?

    Как определить имя пакета apk из результатов поиска

    Сделать веб-проект доступным для записи apache и другим пользователем

    Почему размер раздела и выход df отличаются?

    неправильные / перезаписанные поля при использовании vim на экране GNU

    Удалите пробелы и круглые скобки в именах файлов с помощью sed

    Linux и Unix - лучшая ОС в мире.