Яка різниця між sed і awk? [зачинено]


497
  • Яка різниця між awk і sed?
  • Які додатки найкраще використовувати для інструментів sed та awk?

2
Зв'язаний QA на unix.stackexchange: Чи є базовий підручник з grep, awk та sed?
Дані

Відповіді:


549

sedє редактором потоку. Він працює з потоками символів на основі рядка. Він має примітивну мову програмування, яка включає петлі в стилі goto та прості умови (крім узгодження шаблонів та відповідності адрес). По суті є лише дві "змінні": простір шаблону та пробіл. Читання скриптів може бути важким. Математичні операції в кращому випадку незручні.

Існують різні версії sedз різним рівнем підтримки параметрів командного рядка та мовних функцій.

awkорієнтована на розмежовані поля на основі рядка. Він має набагато більш надійне програмні конструкції , включаючи if/ else, while, do/ whileі for(C-стиль і масив ітерацію). Є повна підтримка змінних та одновимірних асоціативних масивів плюс (IMO) kludgey багатовимірних масивів. Математичні операції нагадують ті, що в C. Він має printfі функції. "K" в "AWK" означає " K ernighan", як і на "Керніган і Річі" книги "Мова програмування 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

Звичайно, це просто дуже прості приклади, які не ілюструють повний спектр можливостей, які кожен може запропонувати.



@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
Просто FYI для тих, хто натикається на це на mac, спробуйте "sed -E 's / - ([0-9] +. [0-9] *) / (\ 1) / g'" для першого прикладу sed
Даніель Шмідт

124

1) Яка різниця між awk і sed?

Обидва є інструментами, що трансформують текст. АЛЕ awk може робити більше речей, крім простого маніпулювання текстом. Це мова програмування сама по собі з більшістю речей, які ви вивчаєте в програмуванні, наприклад, масиви, петлі, якщо / else управління потоком тощо. Ви також можете "програмувати" в sed, але ви не хочете підтримувати написаний в ньому код .

2) Які додатки найкраще використовувати для інструментів sed та awk?

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


7
Приємний момент щодо кривої навчання .. Занадто багато інструментів можуть змішуватися .. тому я вважаю за краще вивчати греп і прокляття .. дозволяємо забути про sed :)
Перше

174
^^ Досить sed. (вибачте, мені довелося)
Грег М. Крсак

8
Я вважаю, що sed набагато простіше навчитися, тому вам потрібно це врахувати. Коли ви навчитеся освоювати awk, може бути корисним швидко вивчити sed, щоб мати можливість швидше використовувати його для речей, які ви ще не вмієте робити в awk.
Дідьє А.

1
@GregKrsak ти зробив мій день. (вибачте, мені довелося)
Abel Callejo

15
Не кидайте sed, 's/search/replace'це простіше набрати, ніж awkсинтаксис 's, і це те, що вам потрібно більшу частину часу.
sjas

54

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

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

Також не слід забувати про це grep. Використовуйте, grepякщо ви хочете лише шукати / витягувати щось у тексті (файлі)

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.