Когда интерпретировать awk как команду или язык программирования?

Когда интерпретировать awk как команду или язык программирования?

Я знаю, что awkэто скриптовый язык программирования, но иногда я путаю, когда я его интерпретирую — как команду, а когда — как программу.

Например, 1-Здесь я интерпретирую как команду:

awk '{print $2}' file.txt

Например, 2-Здесь я интерпретирую как программу awk:

awk 'BEGIN      {skip = 0} \
        skip == 0  {if (NF == 0) 
                     {skip = 1}  \
                    else 
                     {print};  \
                    next} \
        skip == 1  {print; \
                    skip = 0; \
                    next}'

Взято изздесь.

Вопросы следующие:

  1. Когда awk следует интерпретировать как команду?
  2. Когда awk — это программа?
  3. Возникла проблема с вызовом моего первого примера в качестве awkкоманды?

Что-то вроде:

awk '{print $2}' file.txt | awk '{FS=" "} {print 4}'

означает, что awkпрограммы могут общаться с помощью каналов?

решение1

awkимеет два режима вызова: один с текстом программы в командной строке, а другой с программой из файла. Это указано в синопсисе страницы руководства awk (эта страница взята из mawk на Ubuntu 12.04):

   mawk  [-W  option] [-F value] [-v var=value] [--] 'program text' [file
   ...]
   mawk [-W option] [-F value]  [-v  var=value]  [-f  program-file]  [--]
   [file ...]

Называть первую форму программой или нет, зависит от определения программы, которое вы хотите использовать. Я бы сказал, что обе формы включают программы, причем в первой программа указывается как аргумент командной строки. Оба ваших примера относятся к первой форме, поскольку ни один из них не включает опцию -f. То, что во втором примере есть многострочный аргумент командной строки, в этом отношении не имеет значения.

Это не уникально для awk. Например, python по умолчанию интерпретирует аргумент командной строки как имя программы, но с помощью -cопции можно указать программу в командной строке (т. е. по умолчанию все наоборот awk).

Независимо от этого, это связь с использованием каналов. Это заботится синтаксисом оболочки и ОС, единственное, что нужно сделать вашему скрипту, это записать в stdout, reps. прочитать из stdin. Так что да, awkпрограммы могут общаться через каналы.

решение2

Строго говоря, когда вы звонитеawk, вы ссылаетесь на переводчика, а не на язык. Язык называетсяАВК.

awk(или mawk, nawk) — это всего лишь утилита, которая будет выполнять программы, написанные на AWKязыке программирования.

Согласно определению POSIX,программа awkявляется:

программа

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

Так что если вы не используете -foption, вы можете рассматривать два ваших примера как программу awk.

Связанный контент