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
...
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