• 0
Sign in to follow this  
Beraldo

Tutorial AWK

Question

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: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

Edited by Beraldo

Share this post


Link to post
Share on other sites

3 answers to this question

Recommended Posts

  • 0

Tenho um arquivo com 108 milhões de linhas e estou usando o comando awk '{ total = total + $1} END {print total} ' arquivo.txt isso me dá a soma de todas as 108 milhões de linhas, mas eu queria somar a cada 9 milhões. Qual comando devo utilizar?

Meu arquivo tem a seguinte cara:

7,611798

7,705900

7,769710

7,820950

7,906996

7,964038

8,033648

8,102936

8,187371

8,204451

Share this post


Link to post
Share on other sites
  • 0
Em 20/7/2012 at 11:52, Ricardo.Silva disse:

Tenho um arquivo com 108 milhões de linhas e estou usando o comando awk '{ total = total + $1} END {print total} ' arquivo.txt isso me dá a soma de todas as 108 milhões de linhas, mas eu queria somar a cada 9 milhões. Qual comando devo utilizar?

Meu arquivo tem a seguinte cara:

7,611798

7,705900

7,769710

7,820950

7,906996

7,964038

8,033648

8,102936

8,187371

8,204451

 

RICARDO, Tente isso:

cat arquivo... | awk 'NR % 9000000 == 0 {sum=sum+$1}END{print sum}'

 

 

# Tente isso abaixo... Em cada Registro (NR) divisível por 9milhoes, ele soma o campo $1 na variavel sum e no fim (END) dá o total

cat arquivo | awk 'NR % 9000000 == 0 {sum=sum+$1}END{print sum}'

Espero tê-lo ajudado!

;)

# Tente isso abaixo... Em cada Registro (NR) divisível por 9milhoes, ele soma o campo $1 na variavel sum e no fim (END) dá o total

cat arquivo | awk 'NR % 9000000 == 0 {sum=sum+$1}END{print sum}'

Espero tê-lo ajudado!

;)

Share this post


Link to post
Share on other sites
  • 0

Uma possível correção, após testes descobri que o nome dos arquivos de acordo com o código 

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

na verdade é 

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

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this