- В чем разница между awk и sed?
- Какое приложение лучше всего подходит для инструментов sed и awk?
Ответы:
sed
потоковый редактор Он работает с потоками символов для каждой строки. Он имеет примитивный язык программирования, который включает циклы в стиле goto и простые условные выражения (в дополнение к сопоставлению с образцом и сопоставлению адреса). По сути, есть только две «переменные»: пространство образца и пространство хранения. Читаемость скриптов может быть сложной. Математические операции чрезвычайно неуклюжи в лучшем случае.
Существуют различные версии sed
с различными уровнями поддержки параметров командной строки и языковых функций.
awk
ориентировано на разделенные поля для каждой строки. Он имеет гораздо более надежное программные конструкции , включая if
/ else
, while
, do
/ while
и for
(C-стиль и массив итерацию). Существует полная поддержка переменных и одномерных ассоциативных массивов плюс (IMO) многомерных массивов Клуджи. Математические операции напоминают те, что в C. Он имеет printf
и функции. «K» в «AWK» означает « K ernighan», как в «Kernighan and Ritchie» из известной книги «Язык программирования C» (не забывать 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
Конечно, это просто очень простые примеры, которые не иллюстрируют весь спектр возможностей, которые может предложить каждый.
1) В чем разница между awk и sed?
Оба являются инструментами, которые преобразуют текст. НО awk может делать больше вещей, чем просто манипулировать текстом. Это сам по себе язык программирования с большинством вещей, которые вы изучаете в программировании, таких как массивы, циклы, управление потоком if / else и т. Д. Вы также можете «программировать» в sed, но вам не нужно поддерживать код, написанный на нем. ,
2) Какие приложения лучше всего подходят для инструментов sed и awk?
Вывод: используйте sed для очень простого анализа текста. Что-нибудь кроме этого, awk лучше. На самом деле, вы можете полностью отказаться от sed и просто использовать awk. Поскольку их функции перекрываются, и awk может делать больше, просто используйте awk. Вы также уменьшите свою кривую обучения.
sed
, 's/search/replace'
его проще набирать, чем awk
синтаксис, и это то, что вам нужно в большинстве случаев.
Оба инструмента предназначены для работы с текстом, и есть задачи, для которых можно использовать оба инструмента.
Для меня правило их разделения: использовать sed
для автоматизации задач, которые вы бы в противном случае делали в текстовом редакторе вручную. Вот почему это называется потоковым редактором . (Вы можете использовать те же команды для редактирования текста в vim). Используйте, awk
если вы хотите проанализировать текст, то есть подсчитать поля, вычислить итоги, извлечь и реорганизовать структуры и т. Д.
Также не стоит забывать о grep
. Используйте, grep
если вы хотите только найти / извлечь что-то в текст (файл)