AWK - Manipulação de arquivos de texto

Nesse artigo quero mostrar como trabalhar com manipulação de arquivos de texto. Para isso vou utilizar uma linguagem desenvolvida especificamente para esse tipo de trabalho. Essa linguagem é a AWK, ela foi criada em 1977 pelos cientistas Alfred Aho, Peter J. Weinberger e Brian Kernighan no laboratório Bell Labs.

[ Hits: 15.725 ]

Por: Paulo Dias em 03/03/2015 | Blog: http://naotenhosite.eu.nao.tenho


Em forma de comando



Para criar os exemplos, vou utilizar o arquivo /etc/passwd, mas para que tudo ocorra de forma segura, faça uma cópia desse arquivo na pasta "home" do seu usuário. Assim:

cp /etc/passwd $HOME

O arquivo "passwd" tem a seguinte aparência:

saned:x:110:120::/home/saned:/bin/false
ntp:x:111:121::/home/ntp:/bin/false
rtkit:x:114:123:RealtimeKit,,,:/proc:/bin/false
mdm:x:108:112:Gnome Display Manager:/var/lib/mdm:/bin/false
paulo:x:1000:1000:paulo:/home/paulo:/bin/bash

Perceba que é um arquivo CSV separado por ":". Cada linha desse arquivo representa um usuário do sistema, sendo que os campos estão organizados assim:

login: senha : Id do usuario : Id do grupo : informações extras(gecos) : pasta home : shell
Para testar, vou apenas usar o AWK para imprimir o arquivo no terminal, para isso utilizo o seguinte comando:

awk '{ print }' $HOME/passwd

Isso faz o AWK realizar a leitura do arquivo ~/passwd linha por linha e imprimir cada leitura na saída padrão (monitor).

Agora vou mostrar algo um pouco mais elaborado, vou imprimir o arquivo novamente, mas apenas o primeiro campo (login):

awk -F: '{ print $1 }' $HOME/passwd

Dessa vez, eu utilizei o parâmetro "-F", que especifica o separador de campos utilizado no arquivo (nesse caso ":", sem isso, o separador padrão é o Tab ou " "). E além disso, utilizei a variável "$1" (que representa o primeiro campo) com o comando print.

No AWK, para cada linha processada, existe algumas variáveis do tipo "$n", onde n representa um dos campos que foram criados a partir do delimitador utilizado. O primeiro campo é o "$1"... O "$0" contém a linha inteira.

Agora vou mostrar uma variação do exemplo anterior. Nesse exemplo, também vou imprimir o login dos usuários, mas apenas dos usuários que utilizam o shell bash:

awk -F: '{ if( $7 == "/bin/bash" ) print $1 }' $HOME/passwd

Obs.: AWK utiliza os mesmos operadores condicionais e lógicos do C.

Funcionou conforme o esperado, né? Porém, ainda é possível melhorar a aparência dessa saída:

awk -F: ' { if( $7 == "/bin/bash" ) printf "%s usa o shell %s \n", $1, $7 }' $HOME/passwd

Obs.: perceba que o printf do AWK é quase igual ao do C, ele aceita vários formatos, por exemplo: %d, %i, %f, %s e outros.

No próximo exemplo vou adicionar mais uma informação na saída do exemplo anterior... Quero mostrar o total de usuários que utilizam o shell bash, veja:

awk -F: '{ if( $7 == "/bin/bash" ) { printf "%s usa o shell %s \n", $1, $7; total++ } } END { printf "Total de registros %d \n", total }' $HOME/passwd

Perceba que utilizei o bloco END, esse bloco é executado depois que o AWK processou todo o conteúdo do arquivo.

Diferente do C em AWK não é necessário instanciar uma variável. Na primeira vez que uma variável é mencionada, o AWK automaticamente cria uma instância e atribui um valor inicial, para números esse valor inicial é 0 e para strings é "".

Caso seja necessário, também é possível especificar um bloco BEGIN, que é executado antes que o AWK processe o conteúdo do arquivo.

    Próxima página

Páginas do artigo
   1. Em forma de comando
   2. Em forma de script
Outros artigos deste autor

Bitwise - Escovando os bits

JavaScript - Programação orientada a objetos

Como criar um box para o Vagrant

Servidor FTP externo no Ubuntu 12.04 - Criação e configuração

Programação com Shell Script

Leitura recomendada

Como trabalhar com funções em bash

Como matar um processo - kill, killall, pkill e xkill

Bitwise - Escovando os bits

Dialog em GTK

Exemplos práticos de comandos com Parted

  
Comentários
[1] Comentário enviado por fabio em 03/03/2015 - 13:24h

Muito bom artigo, meus parabéns!

[2] Comentário enviado por sk4d1nh4 em 03/03/2015 - 15:06h

Sou da área de infra e sempre que preciso criar alguma coisa com códigos recorro a esse tipo de artigo pra dar um "help".
Muito bom. Parabéns!


[3] Comentário enviado por junior em 04/03/2015 - 16:27h

Quanto Deus criou o mundo, ele usou alguns truques de AWK e SED.
Certeza.


Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts