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.