Pular para o conteúdo principal

awk

A linguagem de programação AWK permite a manipulação de textos a partir de uma sequência de padrões. É uma linguagem interpretada (não há necessidade de compilação).

O nome AWK vem dos sobrenomes dos três criadores da linguagem: Alfred V. Aho, Peter J. Weinberger e Brian W. Kernighan.


Extraindo Colunas

Podemos extrair colunas no AWK passando como argumento o delimitador que o arquivo ou o stdin utiliza. No exemplo abaixo o delimitador é o : e estamos exibindo a primeira coluna do arquivo /etc/passwd, se não informado o delimitador o espaço é considerado como delimitador padrão.

$ awk -F : '{print $1}' /etc/passwd
root
daemon
bin
sys
sync
games
man
lp
mail
...
informação

Se não for informado nenhum delimitador o padrão é o espaço.

Extraindo Multiplas Colunas

Extraindo as colunas 1 e 6:

$ awk -F : '{print $1,$6}' /etc/passwd
root /root
daemon /usr/sbin
bin /bin
sys /dev
sync /bin
games /usr/games
man /var/cache/man
lp /var/spool/lpd
mail /var/mail
...

Formatando a Saída

É possível formatar a saída e concatenar textos, para isso colocamos entre aspas dupla (") o texto desejado:

$ awk -F : '{print "Usuário:"$1 " - Diretório:"$6}' /etc/passwd
Usuário:root - Diretório:/root
Usuário:daemon - Diretório:/usr/sbin
Usuário:bin - Diretório:/bin
Usuário:sys - Diretório:/dev
Usuário:sync - Diretório:/bin
Usuário:games - Diretório:/usr/games
Usuário:man - Diretório:/var/cache/man
Usuário:lp - Diretório:/var/spool/lpd
Usuário:mail - Diretório:/var/mail
...

Concatenando com Outros Softwares

O AWK também suporta entrada via stdin, sendo possível enviar o stdout de outro software para o AWK, como mostra o exemplo abaixo:

$ cat /etc/passwd | awk -F : '{print $1}'
root
daemon
bin
sys
sync
games
man
lp
mail
...

Extraindo String Entre Dois Padrões

Extraindo apenas a primeira ocorrência:

$ echo 'text (value1) text (value2) text (value3) text' | \
awk -F'[()]' '{print $2}'
value1

Extraindo todas as ocorrências:

$ echo 'text (value1) text (value2) text (value3) text' | \
awk -F'[()]' '{for(i=2;i<=NF;i+=2) print $i}'
value1
value2
value3

Utilizando Variáveis

Como o awk costuma utilizar aspas simples na sua síntaxe, para usar variáveis ou variáveis de ambiente é necessários declará-las antes e podemos ver isso no exemplo abaixo onde estamos analisando um arquivo de logs do iperf e salvando em um arquivo CSV para análise em outro software, como por exemplo o Excel.

for x in *iperf.log; do
y=$(echo $x | cut -d"_" -f1)
cat $x | grep receiver | awk -v y="$y" '{print y ";" $7 " " $8}'
done >> results.csv

Calculo de Média

Em alguns casos nos deparamos com logs onde não temos a média, o que não acostuma acontecer em alguns softwares como o ping ou iperf3, entretanto em alguns momentos se faz necessário caso não queira fazer o uso do Excel para isso. Vamos pegar como exemplo o dados abaixo:

$ cat dados.log
2022-12-15T18:50:30 976 Mbits/s
2022-12-15T18:50:31 971 Mbits/s
2022-12-15T18:50:32 956 Mbits/s
2022-12-15T18:50:33 986 Mbits/s
2022-12-15T18:50:34 945 Mbits/s
2022-12-15T18:50:35 904 Mbits/s
2022-12-15T18:50:36 993 Mbits/s
2022-12-15T18:50:37 983 Mbits/s
2022-12-15T18:50:38 982 Mbits/s
2022-12-15T18:50:39 912 Mbits/s
2022-12-15T18:50:40 939 Mbits/s

Para isso podemos concatenar a saída do comando cat para o awk, somando a segunda coluna com a variável $2 e depois dividindo pelo número de valores somados, como mostra o comando.

$ cat dados.log | awk '{ sum += $2; n++ } END { if (n > 0) print sum / n; }'
958.818