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.
Sou Roberto Beraldo (ou apenas Beraldo), desenvolvedor PHP há mais de 15 anos, numa jornada de desenvolvimento para me aprofundar no mundo DevOps e Cloud. Bacharel em Ciência da Computação, com uma base sólida em desenvolvimento web e conhecimentos em DevOps e Computação em Nuvem. Estou dedicado a conectar o desenvolvimento de software com a gestão de infraestrutura.