В чем разница между sed и awk? [закрыто]

497
  • В чем разница между awk и sed?
  • Какое приложение лучше всего подходит для инструментов sed и awk?
Рейчел
источник
2
Связанный QA на unix.stackexchange: есть ли базовое руководство для grep, awk и sed?
Дани
pediaa.com/difference-between-sed-and-awk/…
Хамза Бельмеллуки

Ответы:

550

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

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

Приостановлено до дальнейшего уведомления.
источник
7
Чтобы увидеть некоторые примеры расширения границ sed: sed.sourceforge.net/#scripts
приостановлено до дальнейшего уведомления.
@ DennisWilliamson - Я в невыгодном положении, если я только изучаю awk? Awk гораздо чаще используется, чем sed?
Steam
4
@blasto: Моя рекомендация - изучить оба, но с большим акцентом на awk. Многое из регулярных выражений относится и к обоим (и к другим инструментам и языкам). Используйте sed для более простых вещей и старайтесь избегать сложных вещей. Это действительно здорово, что вы можете делать циклы и ветки в sed, но полученные командные строки сложны и трудны для чтения. Ответ на ваш вопрос действительно зависит от того, что вы делаете.
Приостановлено до дальнейшего уведомления.
@DennisWilliamson - Что было бы наиболее полезным для разработчика ETL? ETL или Extract Transform and Load - это термин для хранения данных. Грубо говоря, работа включает в себя извлечение данных из разных разнородных источников (таких как БД, файлы Excel, файлы CSV и т. Д.), Их преобразование, а затем ЗАГРУЗКА в хранилище данных (DW) для анализа, поиск шаблонов в данных или просто исторические данные. записей. например. Конечное использование DW - Алгоритмы, примененные к DW продуктового магазина, который имеет данные за последние 10 лет, могут показать, что люди, которые склонны покупать яблоки, также покупают апельсины или что-то подобное.
Steam
1
Просто к сведению тех, кто наткнулся на это на Mac, попробуйте "sed -E 's / - ([0-9] +. [0-9] *) / (\ 1) / g'" для первого примера sed
Даниэль Шмидт
124

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

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

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

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

ghostdog74
источник
7
Хороший вопрос о кривой обучения ... слишком много инструментов могут перепутать ... поэтому я бы предпочел изучать только grep и awk ... давайте забудем о sed :)
Outlier
174
^^ Достаточно сед. (извини, мне пришлось)
Грег М. Крсак
8
Я считаю, что sed гораздо легче выучить, поэтому вы должны это учитывать. Когда вы научитесь осваивать awk, может быть полезно быстро научиться sed, чтобы иметь возможность использовать его быстрее для вещей, которые вы еще не знаете, как делать в awk.
Дидье А.
1
@GregKrsak ты сделал мой день. (извини, мне пришлось)
Абель Каллехо
15
Не пренебрегайте sed, 's/search/replace'его проще набирать, чем awkсинтаксис, и это то, что вам нужно в большинстве случаев.
Сьяс
55

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

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

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

hek2mgl
источник