В чем разница между sed и awk?

  • В чем разница между awk и sed?
  • Какое приложение лучше всего подходит случаи для sed и awk-инструментов?

Ответ 1

sed - редактор потока. Он работает с потоками символов на основе строки. Он имеет примитивный язык программирования, который включает в себя циклы стиля goto и простые условные обозначения (в дополнение к сопоставлению шаблонов и сопоставлению адресов). Существуют, по существу, только две "переменные": пространство шаблонов и пространство удержания. Чтение скриптов может быть затруднено. Математические операции в лучшем случае необычайно неудобны.

Существуют различные версии sed с различными уровнями поддержки параметров командной строки и языковых функций.

awk ориентирован на разделенные поля на основе строки. Он имеет гораздо более надежные конструкторы программирования, включая if/else, while, do/while и for (итерация типа C и массив). Существует полная поддержка переменных и одномерных ассоциативных массивов плюс (IMO) kludgey многомерных массивов. Математические операции похожи на те, что указаны в C. Он имеет printf и функции. "K" в "AWK" означает " K ernighan", как в "Kernighan and Ritchie" книги "C Programming Language" (не забыть A ho и W einberger). Можно было бы написать детектор академического плагиата с помощью awk.

GNU awk (gawk) имеет множество расширений, включая истинные многомерные массивы в последней версии. Существуют и другие варианты awk, включая mawk и nawk.

Обе программы используют регулярные выражения для выбора и обработки текста.

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

sed 's/-\([0-9.]\+\)/(\1)/g' inputfile

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

awk -F, 'BEGIN {OFS = ","} {gsub("-([0-9.]+)", "(" substr($3, 2) ")", $3); print}' inputfile

Конечно, это просто очень простые примеры, которые не иллюстрируют весь спектр возможностей, которые каждый может предложить.

Ответ 2

1) В чем разница между awk и sed?

Оба являются инструментами, которые преобразуют текст. НО awk может делать больше вещей, кроме простого манипулирования текстом. Его язык программирования сам по себе с большинством вещей, которые вы изучаете в программировании, например, массивы, циклы, if/else управления потоком и т.д. Вы можете "программировать" и в sed, но вы не захотите поддерживать написанный в нем код.

2) Какое приложение лучше всего подходит для sed и awk-инструментов?

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

Ответ 3

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

Для меня правило их разделения: Используйте sed для автоматизации задач, которые вы могли бы сделать иначе в текстовом редакторе вручную. Вот почему он называется редактором потока. (Вы можете использовать те же команды для редактирования текста в vim). Используйте awk, если вы хотите проанализировать текст, что означает подсчет полей, вычисление итогов, извлечение и реорганизация структур и т.д.

Также не стоит забывать о grep. Используйте grep, если вы хотите только искать/извлекать что-то в тексте (файле)