A linguagem de programação AWK (Sim é uma linguagem) foi criada em 1977 pelos cientistas Alfred Aho, Peter J. Weinberger e Brian Kernighan no laboratório Bell Labs. A palavra AWK é uma abreviatura das iniciais dos sobrenomes dos criadores da linguagem (Aho, Weinberger e Kernighan).
A linguagem é interpretada linha por linha e tem como principal objetivo deixar os scripts de Shell mais poderosos e com muito mais recursos sem utilizar muitas linhas de comando, podendo resolver infinidades de problemas do dia-a-dia do desenvolvedor nesses sistemas operacionais.
Geralmente encontramos muita teoria, mas nada melhor que unir a teoria com a prática.
Vamos supor que você está encubido de enviar uma lista de todos os usuários do sistema. e esta lista pode ser encontrada no arquivo /etc/passwd
mas este arquivo além dos nomes dos usuários também atribui diversos dados, como proceder?
Exemplo do arquivo /etc/passwd
root:x:0:0:root:/root:/bin/zsh
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin
sys:x:3:3:sys:/dev:/usr/sbin/nologin
Bem, há um padrão neste arquivo, perceba que ele tem dois pontos (:) separando uma informação de outra, neste caso utilizaremos a seguinte linha com o awk
awk -F":" '{print $1}' /etc/passwd
O resultado é o seguinte:
root
daemon
bin
sys
Bem, não se espante pois vou explicar agora:
Agora que você têm uma luz, vamos para outros exemplos
Você pode visualizar mais de um campo incluindo mais de uma variável, no exemplo abaixo, listamos o campo do usuário com a variável $1 e o PATH com a variável $6
awk -F":" '{print $1 $6}' /etc/passwd
O resultado é:
root/root
daemon/usr/sbin
bin/bin
sys/dev
temos uma saída bacana, mas os dois campos estão juntos e podemos melhorar a saída adicionando o seguinte:
awk -F":" '{print "User:"$1 " PATH:"$6}' /etc/passwd
Entre aspas duplas antes da variável, pode escrever qualquer coisa, neste caso escrevi "User:" e " PATH:". A saída do comando é:
User:root PATH:/root
User:daemon PATH:/usr/sbin
User:bin PATH:/bin
User:sys PATH:/dev
Agora sim, está bem mais organizado não acha?
Já que sabemos tratar os dados do arquivo, vamos salvar estes dados em um arquivo e entregar o relatório pedido, é ridiculamente simples, basta acrescentarmos o caractere > após o comando e inserir o caminho e nome do arquivo que desejamos:
awk -F":" '{print "User:"$1 " PATH:"$6}' /etc/passwd > /home/$USER/relatorio.txt
Pronto, já temos o relatório para entragar que foi criado de forma simples, indolor e incolor.
Agora vamos supor que você se depara com a seguinte problemática, precisa listar tudo que foi criado no ano de 2019 no diretório do usuário $USER façamos o seguinte:
ls -l /home/$USER | awk '{if ($8 == "2019") print ($0)}'
No comando acima listamos todos os arquivos do usuário com ls, utilizamos o pipe "|" para logo em seguida tratar a saída com o awk. Dentro do awk adicionamos uma condição if de que no campo $8 aprensente somente o que tiver 2019. A saída desde comando para mim foi:
claudio@PC: ls -l /home/$USER | awk '{if ($8 == "2019") print ($0)}'
drwxr-xr-x 2 claudio claudio 4096 jul 15 2019 DevOps
drwxr-xr-x 3 claudio claudio 4096 jul 29 2019 Edraw
drwxr-xr-x 2 claudio claudio 4096 jan 30 2019 Modelos
drwxr-xr-x 2 claudio claudio 4096 fev 20 2019 Público
Para saber as sintaxes do comando awk, basta executar:
awk --help
Fontes: https://pt.wikipedia.org/wiki/AWK http://cesarakg.freeshell.org/awk-1.html