Vamos nos referir à linguagem como AWK e ao executável que interpreta programas AWK como awk ou gawk.
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.
O AWK analisa a entrada como uma série de registros. Cada registro é dividido em zero ou mais campos.
O comportamento padrã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.
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.Você se refere aos campos como $1, $2, $3, etc.
O registro atual é $0.
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.
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.
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.
$NF.NR armazena o número do registro atual.
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.
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.O AWK usa o mesmo conceito de veracidade que o C:
0 é falso.Como o AWK é uma linguagem de processamento de texto, os valores de verdade são estendidos para strings.
"" é falsa.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.
Uma peculiaridade que vale a pena observar
0 é falso."0" é verdadeira!Vamos nos aprofundar nos tipos de dados do AWK em conceitos posteriores.
Os comentários começam com o caractere # e vão até o final da linha.
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}'
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
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