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.
A estrutura de um script AWK (pode estar em um arquivo ou ser escrito diretamente na linha de comando – Shell) é a seguinte:
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:
/^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
ls -l /etc | awk /conf$/
Usando outro separador de campos e imprimindo colunas
cat /etc/passwd | awk -F: '{print $1}'
Usando separador de campos
ls -l /etc |awk '{print $1 FS $8}'
Numerando linhas
ls -l /etc | awk '{print NR FS$1 FS $8}'
Filtra linhas com padrão especificado e mostra apenas as colunas 1 e 8.
ls -l /etc | awk '/conf$/{print $1" "$8}'
Imprime as linhas com mais de 3 campos. Elimina a primeira linha do ls -l (Total)
ls -l /etc | awk 'NF > 3'
Filtra linhas com arquivos cujos nomes possuem menos de 5 caracteres
ls -l /etc | awk 'length($8) < 5'
Imprime linhas pares
ls -l /etc | awk 'NR % 2 == 0 {print NR" "$0}'
Substitui strings
ls -l /etc | awk '{sub(/conf$/,"test"); print $0}'
Procura expressão em determinado campo
ls -l /etc | awk '$8 ~ /^[ae]/'
Inserindo strings entre campos
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):
ls -l | awk 'NR != 1{print "Nome: "$8" Perm: "$1" Tamanho: "$5}'
Imprime o comprimento da maior linha
awk '{ if (length($0) > max) max = length($0)}; END { print max}'; arquivo
Imprime as linhas com mais de 42 caracteres
awk 'length($0) > 42' arquivo
Exibe o número de linhas do arquivo
awk 'END { print NR }' arquivo
