Чи все-таки є підстави вчитися AWK?


109

Я постійно вивчаю нові інструменти, навіть старомодні, бо люблю використовувати правильне рішення проблеми.

Тим не менш, мені цікаво, чи є ще якісь причини вивчити деякі з них. awkнаприклад , мені цікаво, але для простої обробки тексту, я можу використовувати grep, cut, sedі т.д. , а для складних, я піду на Python.

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


2
це 2019 рік, і я просто переписав нормалізатор журналу python. Я запустив перетворення на тиждень журнальних файлів, що складали 54 мільйони файлів журналу рядків (~ 9 ГБ). У моєму Macbook Pro (2,8 ГГц i7, 16 ГБ оперативної пам’яті) версія пітона могла обробляти ~ 10 К рядків в секунду => 90 хвилин часу виконання. Використовуючи mawk, час запуску скорочується до 2 хвилин. До речі, програма awk була вдвічі меншою.
помилка

@mistahenry ти пробував pypy?
qwr

Відповіді:


97

Я думаю, це залежить від середовища, в якому ти опинишся. Якщо ти * nix людина, то знання awk- це хороша річ. Єдине інше середовище сценаріїв, яке можна знайти практично на кожному * nix sh. Тож grep, sed,і т. Д., Безумовно, може замінити awkсучасний мейнстрим- linuxдистрибутив, коли ви переходите до більш екзотичних систем, знаючи, що трохи awkстане справжнім.

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

На завершення, у світі існує багато старого коду, який знає, що трохи awkне зашкодить. Це також зробить вас кращими * nix особи :-)


12
++ Погоджено, awk дійсно є одним з найбільш портативних та, що важливо, послідовних інструментів у наборі інструментів * nix. Наприклад, він надійно працює у зайнятому ящику, наприклад, де perl ніде не знайдено.
гармати

1
І насправді це не так важко навчитися, якщо ти звик до фігурних брекет-мов
гармати

2
"Це те ж саме в будь-якому середовищі" - не зовсім так: під Windows одні котирування повинні бути замінені на подвійні, s та внутрішні парні треба уникати. (Windows - це справжнє середовище, навіть якщо піддавати себе небезпечній напівфабрикатній атроцимації Редмонда ставить вас на милість будь-якого російського 15-річного віку).
GT.

6
Я не думаю, що багато людей пов'язують існування awk та windows в одному Всесвіті .....: P
Складений Хроматин

2
Все ще використовується awk для завдань з обробки тексту. Я часто запускаю сценарій у чомусь іншому (рубін, пітон) і в кінцевому підсумку повертаюся назад, щоб пробудити простоту та потужність.
Rumbleweed

104

Якщо ви швидко засвоїте основи awk, ви дійсно можете зробити дивовижні речі в командному рядку.

Але справжня причина дізнатися про awk - це привід прочитати чудову книгу The AWK Programming Language від її авторів Ахо, Керніган та Вайнбергер. З імені ви могли б подумати, що це просто вчить вас страшно. Власне, це лише початок. Запуск у величезний масив проблем, які можна вирішити один раз, використовуючи стислий мову сценаріїв, що робить маніпуляції з рядками легкими - а awk був одним із перших - він навчає читача як застосовувати базу даних, аналізатор, інтерпретатор , і (якщо пам'ять служить мені) компілятор для невеликої комп'ютерної мови! Якби вони також запрограмували приклад операційної системи за допомогою awk, книга була б досить повним ознайомленням з інформатикою!

Наче чітко і лаконічно, як і оригінальна книга мови С, це також чудовий приклад доброзичливого технічного написання, зробленого правильно. Навіть індекс - це майстерність майстерності.

Awk? Якщо ви це знаєте, ви будете використовувати його в командному рядку періодично, але для чогось більшого ви відчуєте себе в пастці, не в змозі отримати доступ до більш широких функцій вашої системи та Інтернету, до яких щось на зразок Python надає доступ. Але книга? Ви завжди будете раді, що прочитаєте його!


5
+1 Продається Я збираюся замовити цю книгу. Я багато років використовую awk як швидку та потужну однолінійну мову сценаріїв. Awk - це чудовий попередній процесор для файлів, котрий інакше займе десяток рядків для кодування. Я не можу порахувати, скільки разів я використовував форму: awk '{print $ 1, $ 2}'
galaxywatcher

2
Домовились. Це майже не піддається вірі, наскільки компактна цій книзі дається все, що вона містить. Він охоплює більше, ніж більшість сучасних книг на 1/10 (?) Довжини.
глина

3
Я читаю цю книгу зараз, і це розбурило моє захоплення пробудженням до майже одержимості.
galaxywatcher

3
Дивіться також чудовий Gawk: Ефективне програмування AWK .
lhf

1
Я просто прочитав перший розділ. Це дивовижно. Містері вирішила.
vaichidrewar

29

Єдина причина, яку я використовую awk- це автоматичне розщеплення:

awk '{print $3}' < file.in

Це надрукує третє поле, обмежене пробілом у file.in. Це трохи простіше, ніж:

tr -s ' ' < file.in | cut -d' ' -f3

3
навіщо використовувати awk '{print $3}' < file.inзамість awk '{print $3}' file.in? Чи не прокидаються вже прочитані файли, передані як аргументи?
mbigras

@mbigras Звичайно, ви можете використовувати awk будь-яким способом.
Грег Хьюгілл

Навіть з подвоєним розміром мені подобається рішення, яке не стосується. І я не знаю, чому я ненавиджу awk: /
доктор медицини. Mohiuddin Ahmed

25

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

напр

awk -F \t '{ if ($2 > $3) print; }' <filename>

буде надруковано лише у тому випадку, якщо значення 2-го стовпця у файлі, відокремленому вкладкою, перевищує значення 3-го стовпця.

Звичайно, я міг би використовувати Perl або Python, але awk робить це набагато простіше за допомогою стислої однорядкової команди.

Також навчання awk є досить дешевим. Ви можете вивчити основи awk менш ніж за годину, тому це не так багато зусиль, як вивчення будь-якої іншої мови програмування / сценаріїв.


Хоча я насправді не дуже використовую awk, але це чудове використання для awk.
Пол Натан

8

Я час від часу використовую AWK для роботи з HTML. Наприклад, цей код переводить таблиці в CSV-файли:

BEGIN {s=""; FS="n"}
/<td/ { gsub(/<[^>]*>/, ""); s=(s ", " $1);}
/<tr|<TR/ { print s; s="" }

Що чудово, якщо ви знімаєте екран. Насправді, можливо, я люблю AWK, тому що це дозволяє мені так швидко побудувати неправильне рішення проблем :) Більше прикладів . Це також згадується в чудових програмуваннях Жемчука Бентлі .


7

Я використовую awk кожен так часто. Це добре для простого переміщення тексту в середині трубопроводу; він заповнює дуже вузьку нішу між тим, що він взагалі не потребує і потребує вибивати Perl / Python / що завгодно.

Я б не радив витрачати на це чимало часу, але, можливо, стане в нагоді знати основи синтаксису - принаймні достатньо, щоб ви могли швидко проконсультуватися з посібником, якщо ви хочете скористатися ним.


5

Більшість дивних лайнерів може бути досягнуто за допомогою лайнерів Perl one - якщо ви вирішите потрапити в настрій Perl one. Або просто використовуйте Perl три вкладиші :)

Якщо ви підтримуєте сценарії оболонки, написані кимось, хто сподобався awk, то, очевидно, вам потрібно буде вивчити awk.

Навіть якщо немає ніякої практичної потреби, якщо ви вже знаєте, що регулярно висловлюватись, не знадобиться багато часу, щоб підібрати основи, і цікаво подивитися, як тоді були розроблені речі. Це досить елегантно.


5

Через 6 років після того, як я поставив це запитання, тепер я можу відповісти з упевненістю: ні, вивчати анк не варто.

Основні завдання - це керування, але основні команди bash або навіть інструменти GUI легко. Складніші завдання будуть легко вирішуватися за допомогою сучасних динамічних мов, таких як Python (fav або mine) або Ruby.

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


2
Не обов'язково правда. Якщо ви аналізуєте дійсно великі файли, це може бути набагато швидше, ніж інші інструменти.
користувач1071847

Цікаво, тому що через кілька років ви все ще ставите питання про awk. Я був одним із оригінальних респондентів і досі користуюсь ним з певною регулярністю
Dexygen

4

Якщо ви вже знаєте і використовуєте sed, ви можете також взяти хоча б трохи awk. Їх можна поєднати для деяких досить потужних хитрощів. Завжди вражає аудиторію.


4

Нещодавно Computerworld зробив інтерв'ю з Альфредом В. Ахо (одним із трьох творців AWK) про AWK. Це досить цікаве читання. Тож, можливо, ви знайдете у цьому підказки, чому це гарна ідея вивчити AWK.


Приємно, але мене не переконали. AWK - це дуже хороший інструмент, але я думаю, що мені ніколи цього не знадобиться достатньо, щоб витратити час, щоб його вивчити, а не зламати моє рішення в sed або python.
e-satis

4

Навчання AWK було для мене неоціненним в моєму останньому контракті, що працював над вбудованою системою Linux, на якій не встановлено ні Perl, ні більшість інших мов сценарію.


2
9 років потому, і я сьогодні багато використовував awk під час збирання журналів git
Dexygen

3

awk має дуже гарне співвідношення корисність / складність, а "простий awk" працює у всіх Unix / Linux / MacOS (і його можна встановити і в інших системах).

Він був розроблений в Золотий вік, коли люди ненавиділи набирати текст, тому сценарії можна писати дуже, дуже короткими та швидкими. Я спробую встановити mawk, швидку версію, нібито вона прискорює обчислення приблизно в 9 разів, awk / gawk досить повільно, тому якщо ви хочете використовувати його замість R тощо, ви можете захотіти mawk.


2

Це корисно здебільшого, якщо вам доводиться періодично розбирати файли журналів для передачі даних або виводу програм під час написання оболонок, тому що дуже легко досягти цього, щоб це зайняло у вас трохи більше рядків коду в python.

Він, безумовно, має більшу владу, ніж це, але, здається, це завдання, якими користується більшість людей.


2

Звичайно: я працюю в середовищі, де єдиними доступними мовами є: (якась мовна мова, яка генерує COBOL, OMG, OMG), bash (стара версія), perl (я ще не освоюю її), sed, awk , та деякі інші утиліти командного рядка. Знання awkврятувало мене кілька годин (і створило кілька завдань з обробки тексту з моїх колекцій - вони приходять до мене щонайменше три рази на день).


1

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

Наступна команда, мабуть, єдина, для якої я використовував awk в останні два роки (він очищає напівзняті пакети з моїх систем Debian / Ubuntu):

$ dpkg -l|awk '/^rc/ {print $2}'|xargs sudo dpkg -P

1

Ні.

Хоча це може бути цікаво, ви можете робити все, що може зробити awk, використовуючи інші, більш потужні інструменти, такі як Perl.

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


1

Я б сказав, що є. Щодо простих речей, AWK набагато простіше для недосвідченого sysadmin / розробника, ніж Python. Ви можете навчитися трохи AWK та багато чого робити, вивчаючи Python означає вивчити зовсім нову мову (так, я знаю, що AWK - це мова, це сенс).

Perl, можливо, зможе зробити багато речей, які AWK може зробити, але запропонувавши вибір у цей день та вік, я б обрав тут Python. Так що так, ви повинні навчитися AWK. але навчись і Python :-)


1

awkє мовою powertool, тому ви, ймовірно, awkдесь знайдете його, якщо ви будь-який ІТ-професіонал. Якщо ви можете обробити синтаксис і регулярні вирази, grepі sedтоді у вас не повинно виникнути жодних проблемawk і це, мабуть, варто.

Де я знайшов awkсправжній блиск у тому, щоб спростити такі речі, як обробка багаторядкових записів та керування / інтерполяція декількох файлів одночасно.


0

Тепер, коли PERL переноситься майже на кожну значну платформу, я б сказав, що цього не варто. Це більш універсально, ніж sed і awk разом. Що стосується автоматичного розщеплення, ви можете зробити це в perl, як це:

perl -F':' -ane 'print $F[3],"\n";' /etc/passwd

EDIT: можливо, ви все ще хочете трохи ознайомитись з awk, оскільки деякі інші інструменти базуються на його філософії дії, що базується на шаблонах (наприклад, DTrace на Solaris).


0

Я працюю в області файлів у стовпчиковому форматі Тож awk для мене неоціненний, щоб РЕФОРМУВАТИ файл, щоб різні програми могли працювати разом. Для професіоналів, які не є ІТ, використання awk досить і досконало. Зараз день, швидкість роботи комп'ютера - це не проблема, тому я можу комбінувати awk & unix для передачі багатьох команд 1 вкладишів у "скрипт". За допомогою Awk пошуку по полям і записам я використовую його для перевірки даних файлів дуже швидко, замість "vi", щоб відкрити файл. Я мушу сказати, що здатність awk принесла радість моїй роботі спеціально, я в змозі допомогти співпрацівнику швидко розібратися з допомогою awk. Дивовижний код для мене.


0

Нещодавно я намагався візуалізувати мережеві файли pcap, що реєструють атаку DOS, яка становила понад 20 Гбіт. Мені потрібна була мітка часу та Ip-адреси. За моїм сценарієм, однокласинка AWK також працювала казково і досить швидко. Я спеціально використовував AWK для очищення вилучених файлів, отримання ip-адрес та загальної кількості пакетів з цих IP-адрес протягом згрупованого періоду часу. Я повністю згоден з тим, що писали інші люди вище. Це залежить від ваших потреб.


0

Однією з причин НЕ вивчати awk є те, що в ньому немає не жадібних відповідностей у регулярних виразах.

У мене є код awk, який тепер я повинен переписати лише тому, що я раптом налагодив, що в awk / gawk немає такого поняття, як не жадібні відповідники, тому він не може правильно виконати деякі регекси.


0

Це залежить від ваших товаришів по команді та вашого керівника та завдання, над яким ви працюєте.

if( team mates and leader ask to write awk ){
  if( you can reject that){
    if( awk code is very small){
      learn little just like learn Regex
    }else{
      use python or even java
    }
  }else{
    do as they ask
  }
}

0

Я в даний час роблю кодування в python. Але я все ще не знаю цього досить добре, щоб легко використовувати для простих одноразових перетворень файлів.

За допомогою awk я можу швидко розробити однорядковий фрагмент коду в командному рядку Unix, який робить деякі досить швейцарські перетворення. Щоразу, коли я використовую awk, фрагмент коду, який я пишу, буде одноразовим і не більше кількох рядків. Може бути "if" statment та "printf" тут або там у одному рядку.

Я ніколи не писав шматок коду, довжиною більше 10 рядків з awk. Я бачив кілька таких сценаріїв років тому.

Але все, що вимагало багато рядків коду, я б вдався до python.

Я люблю awk. Це дуже потужний засіб в поєднанні з sed.

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