Tutorial AWK

Não sou nenhum expert ou grande conhecedor da linguagem AWK, mas ela é muito útil e me ajudou muito nas provas sobre Shell Script na faculdade. Por isso resolvi escrever este pequeno e introdutório tutorial acerca dessa linguagem. É bom todo usuário Linux saber usá-la. =)

AWK é uma linguagem utilizada para processamento de informações em texto, como o conteúdo de um arquivo – principalmente informações em colunas – ou a saída de outros comandos, como cat, grep etc.

NOTA: O conteúdo deste post foi aprimorado e somado a diversos outros temas ligados à Programação usando Shell Script. Tudo isso resultou no curso “Shell Script Para Programadores“. Conheço melhor o curso neste link.

A estrutura de um script AWK (pode estar em um arquivo ou ser escrito diretamente na linha de comando – Shell) é a seguinte:

1
2
3
4
5
6
7
8
9
10
11
BEGIN{
 Comandos executados ao iniciar o processamento, antes de ler as linhas do texto
}
 
[condicao]{
 Comandos a serem executados em todas as linhas do texto
}
 
END{
 Comando final. Executado após o processamento de todas as linhas
}

A condição do segudo bloco é opcional. Se não especificada, os respectivos comandos do bloco serão executados em todas as linhas. Caso contrário, serão executados apenas nas linhas que satisfizerem a condição.
A condição pode ser uma expressão regular. Basta colocá-la entre barras:

1
2
3
/^A/{
 Comando...
}

Se um bloco de comandos estiver vazio, é executado print $0, ou seja, imprime a linha corrente.

Algumas variáveis definidas no AWK:

FS -> separador de campos
NR -> número da linhas
NF -> número de campos na linha

Para mais informações:

Manpage do AWK: $ man awk
http://www.gnu.org/software/gawk/manual/gawk.html
http://en.wikipedia.org/wiki/Awk

Exemplos:

Filtra as linhas com o padrão especificado. Linhas que terminam com conf

1
ls -l /etc | awk /conf$/

Usando outro separador de campos e imprimindo colunas

1
cat /etc/passwd | awk -F: '{print $1}'

Usando separador de campos

1
ls -l /etc |awk '{print $1 FS $8}'

Numerando linhas

1
ls -l /etc | awk '{print NR FS$1 FS $8}'

Filtra linhas com padrão especificado e mostra apenas as colunas 1 e 8.

1
ls -l /etc | awk '/conf$/{print $1" "$8}'

Imprime as linhas com mais de 3 campos. Elimina a primeira linha do ls -l (Total)

1
ls -l /etc | awk 'NF > 3'

Filtra linhas com arquivos cujos nomes possuem menos de 5 caracteres

1
ls -l /etc | awk 'length($8) < 5'

Imprime linhas pares

1
ls -l /etc | awk 'NR % 2 == 0 {print NR" "$0}'

Substitui strings

1
ls -l /etc | awk '{sub(/conf$/,"test"); print $0}'

Procura expressão em determinado campo

1
ls -l /etc | awk '$8 ~ /^[ae]/'

Inserindo strings entre campos

1
cat /etc/passwd | awk -F: '{print "Login: " $1}'

Filtra a saída de ls -l, a fim de mostrar o nome do arquivo, suas permissões e seu tamanho (a condição NR != 1 evita que a linha Total seja exibida):

1
ls -l | awk 'NR != 1{print "Nome: "$8" Perm: "$1" Tamanho: "$5}'

Imprime o comprimento da maior linha

1
awk '{ if (length($0) > max) max = length($0)}; END { print max}'; arquivo

Imprime as linhas com mais de 42 caracteres

1
awk 'length($0) > 42' arquivo

Exibe o número de linhas do arquivo

1
awk 'END { print NR }' arquivo

Dicas de Livros e Cursos

Um excelente eBook, que comtempla o AWK e também o SED (outra excelente linguagem) é o SED And AWK Pocket Reference. Aproveite a versão digital, que pode ser lida em qualquer dispositivo usando o aplicativo Kindle, da Amazon.

Para aprender mais sobre Comandos Linux e Shell Script, veja meu curso Shell Script Para Programadores.

The following two tabs change content below.
Graduado em Ciência da Computação, pela Universidade Federal do Paraná (UFPR), é desenvolvedor de software desde 2008, com foco em Desenvolvimento Web com PHP.