Ir para conteúdo
Fórum Script Brasil
  • 0

Tutorial AWK


Beraldo

Pergunta

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

Editado por Beraldo
Link para o comentário
Compartilhar em outros sites

3 respostass a esta questão

Posts Recomendados

  • 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

Link para o comentário
Compartilhar em outros 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!

;)

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,3k
    • Posts
      652,3k
×
×
  • Criar Novo...