Ao interpretar o awk como um comando ou uma linguagem de programação?

1

Eu sei que awk é uma linguagem de programação de script, mas às vezes fico confuso sobre quando interpreto como comando ou como um programa.

Eg. 1 - Aqui eu interpreto como um comando :

awk '{print $2}' file.txt

Eg. 2 - Aqui eu interpreto como um programa awk :

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

Retirado de aqui .

As perguntas são:

  1. Quando o awk precisa ser interpretado como um comando?
  2. Quando o awk é um programa?
  3. Há um problema em chamar meu primeiro exemplo como um comando awk ?

Algo como:

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

significa que awk programas podem se comunicar usando pipes?

    
por Cold 16.10.2014 / 12:04

2 respostas

3

awk tem modos de chamada de reboque, um com um texto de programa na linha de comando e outro com um programa de um arquivo. Isto é afirmado na sinopse da página man awk (esta do mawk on Ubunut 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 ...]

O fato de chamar ou não o primeiro formulário de um programa depende da definição de programa que você deseja usar. Eu diria que ambas as formas envolvem programas, sendo que no primeiro o programa é especificado como um argumento de linha de comando. Ambos os seus exemplos são da primeira forma, já que nenhum deles envolve a opção -f . Que o segundo exemplo tenha um argumento de linha de comando multilinha é, com relação a isso, irrelevante.

Isso não é exclusivo de awk . por exemplo. python por padrão interpreta um argumento de linha de comando como um nome de programa, mas com a opção -c permite que você especifique um programa na linha de comando (ou seja, o padrão é o contrário de awk ).

Independente disso é a comunicação usando pipes. Isso é feito pela sintaxe do shell e pelo sistema operacional, a única coisa que seu script precisa fazer é gravar em stdout, reps. leia de stdin. Então, sim, awk programas podem se comunicar por canos.

    
por 16.10.2014 / 12:10
3

Estritamente falando, quando você chama awk , você se refere ao intérprete, não ao idioma . O idioma é chamado AWK .

awk (ou mawk , nawk ) é apenas um utilitário, que executará programas escritos em AWK language.

Como POSIX definido, o programa awk é:

program

If no -f option is specified, the first operand to awk shall be the text of the awk program. The application shall supply the program operand as a single argument to awk. If the text does not end in a , awk shall interpret the text as if it did.

Então, se você não usa a opção -f , você pode considerar dois dos seus exemplos como programa awk.

    
por 16.10.2014 / 12:31

Tags