Dicas de linux



Dicas de linux

Awk - Uma poderosa ferramenta de análise

Dica enviado por Leonardo Berbert Gomes

A linguagem awk é muito conhecida por sua eficácia em criar filtros de conteúdos de arquivos. Nessa dica vou ensinar alguns truques que facilitarão a vida de todos.

Vamos tomar como base o arquivo leo.txt, que tem o seguinte conteúdo:

188 :2106102121 192.168.0.89
267 :2206211021 192.168.0.88
438 :2306211021 192.168.0.87

1. Preciso mostrar na tela a primeira coluna do arquivo:

$ cat leo.txt | awk ´{print $1}´
188
267
438

Entendendo:
  • print $1 -> Exibe a primeira coluna;
  • print $2 -> Exibe a segunda coluna e assim por diante;
  • print $NF ->Exibe a última coluna.

2. Em seguida me foi solicitado que contasse as linhas do resultado acima, para isso podemos utilizar outro comando após o resultado:

$ cat leo.txt | ´{print $1}´ | wc -l

3. Suponha que eu necessite vasculhar esse arquivo e mostrar apenas os campo com dia e mês, repare que na frente do dia existe um ":" que nos atrapalharia um pouco nessa busca. Vou usar o comando cat para mostrar que o awk pode ser combinado com os comandos do shell:

  • $ cat leo.txt | awk -F ":" ´{print substr($2,1,4)}´
  • 2106
  • 2206 2306

    Entendendo:
    • awk -F ":" -> Ignora o caractere ":" da segunda coluna;
    • {print substr($2,1,4)}´ -> Exibe a segunda coluna do primeiro ao quarto caractere.

    4. Agora eu gostaria que, após mostrar esse resultado, ele fizesse um filtro por uma data específica, vou tomar como seleção "2106":

    $ cat leo.txt | awk -F ":" ´{print substr($2,1,4)}´ | grep 2106
    2106

    5. Vamos dificultar um pouco as coisas agora. Eu agora tenho um outro arquivo (leo2.txt) com o seguinte conteúdo:

    183201
    183202
    183203
    183204
    183205
    183206
    183207
    183208
    183209

    6. Me foi solicitado que fizesse um filtro para descobrir todos os campos de 18:32:02 até 18:32:08. Observe que aqui estaremos trabalhando com um intervalo. Então ficaria da seguinte forma:

    $ cat leo2.txt | awk ´{if (($1) >= "183202" && ($1) <= "183208") print}´
    183202
    183203
    183204
    183205
    183206
    183207
    183208

    Obs.: Neste último exemplo temos uma condição que deve ser atendida, se verdadeira, exibe o resultado encontrado.

    Pessoal, espero ter ajudado. Em breve darei continuidade à dica com mais truques de Awk.


  • www.dicasdelinux.com.br - Dicas de Linux para te ajudar no Dia-dia "Seja livre! Acesse dicas de linux."