Trilhas
/
AWK
AWK
/
Programa
/
Fundamentos
Fu

Fundamentos em AWK

1 exercício

Sobre Fundamentos

Vamos nos referir à linguagem como AWK e ao executável que interpreta programas AWK como awk ou gawk.

Padrões e ações

Um programa AWK é composto de pares padrão-ação

pattern1 { action1 }
pattern2 { action2 }
...

Um padrão pode ser uma expressão regular para comparar com a entrada. Também pode ser qualquer expressão que resulte em um valor verdadeiro ou falso.

Uma ação é um ou mais comandos AWK. As chaves ao redor são obrigatórias.

Se o resultado do padrão for verdadeiro, a ação correspondente é avaliada.

Registros e campos

O AWK analisa a entrada como uma série de registros. Cada registro é dividido em zero ou mais campos.

O comportamento padrão é:

  • dividir a entrada em registros usando a nova linha como "separador de registros"; assim, cada linha é um registro.
  • dividir o registro em campos usando espaço em branco como "separador de campos"; assim, cada palavra é um campo.

Padrões e ações, continuação

O padrão pode ser omitido, e nesse caso a ação é avaliada para cada registro de entrada.

A ação pode ser omitida, e nesse caso a ação padrão é imprimir o registro atual.

Padrões especiais

Há dois padrões especiais usados com frequência.

  • BEGIN avalia a ação associada antes de qualquer entrada ser consumida.
  • END avalia a ação associada depois que toda a entrada for consumida.

Variáveis de campo

Você se refere aos campos como $1, $2, $3, etc.

O registro atual é $0.

Caution

Para ser explícito, estes não são, a rigor, "variáveis". O $ pode ser considerado um operador que obtém o valor do número de campo dado. Vamos nos aprofundar nisso em conceitos posteriores.

Aqui estão algumas outras variáveis internas usadas com frequência.

Variáveis internas que controlam a análise da entrada

  • RS é o separador de registros da entrada. Como mencionado, seu valor padrão é uma nova linha.
  • FS é o separador de campos da entrada.

Essas variáveis costumam ser definidas no bloco de ações BEGIN.

Variáveis internas que transmitem informação

Essas variáveis são definidas automaticamente pelo AWK durante a execução do programa.

  • NF armazena o número de campos do registro atual.
    • Para obter o valor do último campo, use $NF.
  • NR armazena o número do registro atual.
    • Quando vários arquivos de entrada estão sendo processados, NR conterá o número total de registros processados até o momento.
  • FNR armazena o número do registro atual do arquivo de entrada atual.
    • Para ilustrar a diferença entre NR e FNR, aqui está um idioma AWK comum.
      NR == FNR {action}
      
      Isso significa "se o número de registro acumulado for igual ao número de registro do arquivo atual". Isso só pode ser verdadeiro para registros do primeiro arquivo de entrada.

Veracidade

O AWK usa o mesmo conceito de veracidade que o C:

  • O número 0 é falso.
  • Qualquer outro número é verdadeiro.

Como o AWK é uma linguagem de processamento de texto, os valores de verdade são estendidos para strings.

  • Uma string vazia "" é falsa.
  • Qualquer string não vazia é verdadeira.
Note

O AWK usa o mesmo conceito de veracidade que o C

O AWK surgiu nos Bell Labs na década de 1970, no mesmo ambiente onde o C foi inventado. O C teve uma grande influência na sintaxe do AWK.

Caution

Uma peculiaridade que vale a pena observar

  • O número 0 é falso.
  • A string não vazia "0" é verdadeira!

Vamos nos aprofundar nos tipos de dados do AWK em conceitos posteriores.

Comentários

Os comentários começam com o caractere # e vão até o final da linha.

Como passar entrada para o awk

O awk pode ler a entrada de arquivos ou da entrada padrão. Qualquer uma destas técnicas funciona.

awk '/regex/ {print $1}' file1 file2 ...

awk '/regex/ {print $1}' < file

some_command_here | awk '/regex/ {print $1}'

Exemplos

Em sistemas do tipo Unix, /etc/passwd contém informação sobre usuários. Cada usuário é descrito em uma linha separada, com os campos separados por dois pontos.

Para listar os nomes de usuário:

awk '
    BEGIN { FS = ":" }
    { print $1 }
' /etc/passwd

Repare que a ação {print $1} não tem padrão, então é executada para cada registro.

Se quisermos limitar a saída a apenas os usuários que usam o bash como shell de login, podemos fazer:

awk '
    BEGIN { FS = ":" }
    $7 == "/bin/bash" { print $1 }
' /etc/passwd

Mais alguns exemplos

Aqui estão alguns programas awk que produzem os mesmos resultados que outros comandos Unix comuns.

  • Exibir um arquivo

    cat file.txt
    
    awk '1' file.txt
    
  • Procurar padrões em um arquivo

    grep 'foo.*bar' file.txt
    
    awk '/foo.*bar/' file.txt
    
  • Exibir apenas algumas linhas no início de um arquivo

    head -n 20 file.txt
    
    awk '
        1
        NR == 20 {exit}
    ' file.txt
    
  • Substituir texto em um arquivo

    sed 's/foo/bar/' file.txt
    
    awk '{sub(/foo/, "bar")};1' file.txt
    # or more readably
    awk '
        {
            sub(/foo/, "bar")
            print
        }
    ' file.txt
    
Editar via GitHub O link abre em uma nova janela ou aba

Aprenda Fundamentos