É comum combinar o processador de texto AWK com scripts Shell para automatizar tarefas complexas. Os dados normalmente são passados para o AWK e seus resultados são formatados para serem úteis de volta no Shell.
1. Incorporando Variáveis do Shell em Comandos AWK
Existem duas técnicas principais para incorporar variáveis do Shell dentro de prograams AWK.
Método 1: Substituição Direta por Aspas
A abordagem mais imediata envolve usar aspas duplas no script AWK, permitindo que o Shell subsittua a variável diretamente.
$ cat conteudo.txt
Sistema - Linux, Windows
Banco - PostgreSQL, MySQL
Rede - TCP/IP, HTTP
$ cat busca_termo.sh
#!/bin/bash
read -p "Informe a palavra-chave: " termo
awk "/$termo/" '{ contagem++; print } END { print contagem " linha(s) encontrada(s)." }' conteudo.txt
Executando o script:
$ ./busca_termo.sh
Informe a palavra-chave: TCP
Rede - TCP/IP, HTTP
1 linha(s) encontrada(s).
Este método, embora funcional, depende da correta interpretação das aspas pelo Shell, o que pode ser confuso.
Método 2: Uso da Opção -v para Atribuição de Variáveis
Uma abordagem mais robusta e legível utiliza a flag -v do AWK para passar o valor da variável do Shell para uma variável interna do AWK. O programa AWK é então delimitado por aspas simples.
$ cat busca_melhorada.sh
#!/bin/bash
read -p "Informe a palavra-chave: " termo
awk -v chave="$termo" '$0 ~ chave { achados++; print } END { print achados " linha(s) correspondente(s)." }' conteudo.txt
Execução:
$ ./busca_melhorada.sh
Informe a palavra-chave: HTTP
Rede - TCP/IP, HTTP
1 linha(s) correspondente(s).
Acessando Variáveis de Ambiente do Shell
O interpretador AWK mantém uma cópia das variáveis de ambiente do Shell em um array chamado ENVIRON. Elas podem ser acessadas pelo nome da variável.
$ awk 'meupath=ENVIRON["PATH"] { print "O valor de PATH é: " meupath }' /dev/null
2. Definindo Variáveis do Shell a Partir da Saída do AWK
A saída de um comando AWK pode ser capturada para atribuir valores a variáveis do Shell.
$ nome_sistema=$(awk -F' - ' '/Sistema/{ print $2 }' conteudo.txt)
$ echo $nome_sistema
Linux, Windows
Para definir múltiplas variáveis a partir da saída de um único comando AWK, o script AWK pode imprimir linhas no formato variável=valor. O comando eval é então usado para interpretar essas linhas no Shell.
$ atribuicoes=$(awk -F' - ' '{
if ($1 == "Sistema") print "os="$2;
if ($1 == "Rede") print "proto="$2;
}' conteudo.txt)
$ echo $atribuicoes
os=Linux, Windows proto=TCP/IP, HTTP
$ eval $atribuicoes
$ echo $os
Linux, Windows
$ echo $proto
TCP/IP, HTTP
Alternativamente, a saída do AWK pode ser redirecionada para um arquivo temporário que é depois lido pelo comando source.
$ awk -F' - ' '{ if ($1 == "Banco") print "db="$2 }' conteudo.txt > temp_vars.sh
$ cat temp_vars.sh
db=PostgreSQL, MySQL
$ source temp_vars.sh
$ echo $db
PostgreSQL, MySQL