Есть ли еще какие-то причины изучать AWK?


109

Я постоянно изучаю новые инструменты, даже устаревшие, потому что мне нравится использовать правильное решение проблемы.

Тем не менее, мне интересно, есть ли еще какая-то причина изучать некоторые из них. awkнапример , мне интересно, но для простой обработки текста, я могу использовать grep, cut, sedи т.д. , а для сложных, я пойду на Python.

Я не имею в виду, что это не мощный и удобный инструмент. Но поскольку изучение нового инструмента требует времени и энергии, стоит ли оно того ?


2
Сейчас 2019 год, и я только что переписал нормализатор журнала Python на awk. Я провел преобразование для файлов журнала за неделю, которые составляли 54 миллиона строк в файле журнала (~ 9 ГБ). На моем Macbook Pro (2,8 ГГц i7, 16 ГБ ОЗУ) версия на Python могла обрабатывать ~ 10 тыс. Строк в секунду => 90 минут работы. При использовании mawk время работы сократилось до 2 минут. Кстати, программа awk была вдвое меньше.
Mistahenry

@mistahenry вы пробовали pypy?
qwr

Ответы:


97

Я думаю, это зависит от среды, в которой вы находитесь. Если вы ниггер, то знание awk- это хорошо. Единственная другая среда сценариев, которую можно найти практически на каждом * nix, - это sh. Таким образом, while grepи sed,т. Д. , Несомненно, могут заменить awkсовременный основной linuxдистрибутив, когда вы переходите на более экзотические системы, зная, что немного awk, будет действительно удобно.

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

В заключение хочу сказать, что по всему миру крутится много старого кода, зная, что немного awkне повредит. Это также сделает вас лучше * nix person :-)


12
++ Согласен, awk действительно является одним из самых переносимых и, что важно, последовательных инструментов в наборе инструментов * nix. Он надежно работает, например, на busybox, где нигде нет Perl.
guns

1
И это действительно не так сложно выучить, если вы привыкли к языкам фигурных скобок
guns

2
«Это то же самое в любой среде» - не совсем так: в Windows одинарные кавычки должны быть заменены на двойные, s и внутренние двойники должны быть экранированы. (Windows - это своего рода реальная среда, даже если подвергнуть себя незащищенному полузавершенному зверству Редмонда, вы попадете в зависимость от любого русского 15-летнего).
GT.

6
Я не думаю, что многие люди связывают существование awk и windows в одной вселенной .....: P
FoldedChromatin

2
Все еще использую awk для обработки текста. Я часто начинаю скрипт на чем-нибудь другом (ruby, python) и в конечном итоге возвращаюсь к awk для простоты и мощности.
Rumbleweed

104

Если вы быстро изучите основы awk, вы действительно сможете делать удивительные вещи в командной строке.

Но настоящая причина изучить awk - это иметь оправдание, чтобы прочитать превосходную книгу «Язык программирования AWK » ее авторов Ахо, Кернигана и Вайнбергера. Судя по названию, можно подумать, что он просто учит awk. Собственно, это только начало. Приступая к огромному количеству проблем, которые можно решить, если использовать краткий язык сценариев, который упрощает манипуляции со строками - и awk был одним из первых - он продолжает учить читателя, как реализовать базу данных, синтаксический анализатор, интерпретатор и (если мне не изменяет память) компилятор для небольшого компьютерного языка для конкретного проекта! Если бы они также запрограммировали пример операционной системы с использованием awk, книга была бы довольно полным обзором, вводящим в информатику!

Известно, что он ясный и лаконичный, как и оригинальная книга по языку C, он также является прекрасным примером грамотного написания технической документации. Даже указатель - это произведение искусства.

Ничего себе? Если вы это знаете, вы будете время от времени использовать его в командной строке, но для чего-то большего вы будете чувствовать себя в ловушке, не имея доступа к более широким функциям вашей системы и Интернета, к которым предоставляет доступ нечто вроде Python. Но книга? Вы всегда будете рады, что прочитаете это!


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

2
Согласовано. Почти невозможно поверить, насколько компактна эта книга, учитывая все, что она содержит. Он охватывает больше, чем большинство современных книг, на 1/10 (?) Длины.
глина

3
Я читаю эту книгу сейчас, и мой энтузиазм по поводу awk развился до почти одержимости.
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? Разве awk уже не читает файлы при передаче в качестве аргументов?
mbigras

@mbigras Конечно, вы можете использовать awk в любом случае.
Грег Хьюгилл

Даже с двойным размером мне нравится не-awk-решение. И я не знаю, почему я ненавижу awk: /
МД. Мохиуддин Ахмед

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, потому что он позволяет мне так быстро создавать неправильные решения проблем :) Еще примеры . Это также упоминается в прекрасной книге Джона Бентли Programming Pearls .


7

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

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


5

Большинство awk one liners может быть достигнуто с помощью Perl one liners - если вы решите погрузиться в образ мышления Perl one liner. Или просто используйте Perl three liners :)

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

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


5

Спустя 6 лет после того, как я задал этот вопрос, я теперь могу с уверенностью ответить: нет, изучать awk не стоит.

С основными задачами можно справиться, но с простыми командами bash или даже с инструментами графического интерфейса. Более сложные задачи легко решаются с помощью современных динамических языков, таких как Python (любимый или мой) или Ruby.

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


2
Не обязательно верно. Если вы разбираете действительно большие файлы, это может быть намного быстрее, чем другие инструменты.
user1071847 03

Интересно, потому что через несколько лет вы все еще задаете вопросы об 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 очень хорошее соотношение полезность / сложность, а "simple awk" работает во всех Unix / Linux / MacOS (и его можно установить и в других системах).

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


2

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

Он, безусловно, обладает большей мощностью, но, похоже, большинство людей использует его для этих задач.


2

Конечно: я работаю в среде, где доступны только следующие языки: (некоторый язык shity, который генерирует 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.

Потратьте свое время на изучение этих более мощных инструментов - и только случайно подберите awk по пути.


1

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

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


1

awk- это язык мощных инструментов, поэтому вы, вероятно, найдете awkгде-нибудь применение, если вы ИТ-специалист любого рода. Если вы можете обрабатывать синтаксис и регулярные выражения grepи sedтогда вы не должны иметь никаких проблем подбираяawk и это, вероятно , стоит.

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


0

Теперь, когда PERL портирован практически на все важные платформы, я бы сказал, что это того не стоит. Он более универсален, чем вместе взятые sed и awk. Что касается автоматического разделения, вы можете сделать это в perl следующим образом:

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

РЕДАКТИРОВАТЬ: вы все равно можете немного познакомиться с awk, потому что некоторые другие инструменты основаны на его философии действий на основе шаблонов (например, DTrace в Solaris).


0

Я работаю в области, файлы в формате столбцов. Поэтому awk бесценен для меня, чтобы РЕФОРМАТИРОВАТЬ файл, чтобы различные программы могли работать вместе. Для не ИТ-специалистов использование awk достаточно и идеально. Сегодня скорость компьютера не является проблемой, поэтому я могу комбинировать awk и unix для передачи нескольких команд 1 liners в «скрипт». С поиском в 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» и выражение «printf» здесь или там в одной строке.

Я никогда не писал на awk фрагментов кода длиной более 10 строк. Я видел несколько таких сценариев много лет назад.

Но все, что требовало большого количества строк кода, я бы прибегал к python.

Обожаю awk. Это очень мощный инструмент в сочетании с sed.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.