Redirect message from awk condition

1

Gostaria de redirecionar minha mensagem personalizada ao verificar a conectividade do meu servidor para um arquivo de log. Estou quebrando a condição usando a saída 1, mas como torná-la mais detalhada e redirecionada para um arquivo de log?

Como posso conseguir isso dentro de awk para se adequar bem à mensagem com o redirecionamento:

awk { ... "Connectivity to ${rda} failed, exiting" >> ${log} ... } then

Meu script é o seguinte:

#/bin/bash
rda="www.google.com"                       
log="/var/log/connectivity.log"

if nc -zw1 ${rda} 22 && echo |openssl s_client -connect ${rda}:22 2>&1 |awk '
    handshake && $1 == "Verification" { if ($2=="OK") exit;exit 1; }
    $1 $2 == "SSLhandshake" { handshake = 1 }'
then
    echo -e "Connectivity works" >> ${log}
    exit 0
fi

Minha versão do awk é:

# awk -W version mawk 1.3.3 Nov 1996, Copyright (C) Michael D. Brennan

compiled limits: max NF             32767 sprintf buffer      2040
    
por creed 26.09.2018 / 11:39

3 respostas

0

Como já foi descrito, você pode usar essa construção para escrever (e continuar escrevendo) em um arquivo:

awk '{ print "hello, world" >>"file.log" }'

A outra parte do quebra-cabeça é como obter a variável do shell $log em awk sem citações complexas. O sinalizador -v permite que você defina uma variável awk , que neste caso definimos como o valor da variável $log :

da shell
awk -v logfile="$log" { print "Appending to", logfile, "here" >>logfile }'

(Eu não usei log="$log" porque awk variants (pelo menos mawk e gawk ) usam log como um built-in e não permite que ele seja redefinido.)

    
por 26.09.2018 / 12:04
0

Você pode combinar todo o log em um script awk . Tente adaptar seu script como

awk -v rda="${rda}"'

handshake &&
$1 == "Verification"    {if ($2=="OK")  {print "Connectivity works"
                                         exit
                                        }
                         print "Connectivity to " rda " failed, exiting"
                         exit 1
                        }

$1 $2 == "SSLhandshake" {handshake = 1
                        }
' >> "${log}"

Se você quiser diferenciar entre a saída normal e a de erro, redirecione os erros para /dev/stderr em awk .

    
por 26.09.2018 / 12:07
0

Você pode print para um arquivo em awk usando

print "data" >"somefile.log"

ou

filename="somefile.log"
print "data" >filename

Usar > truncará o arquivo no primeiro print , mas o arquivo permanecerá aberto até o script terminar ou você explicitamente close() o arquivo. Enquanto o arquivo estiver aberto (após o primeiro print > ), as chamadas subseqüentes para print > serão adicionadas ao arquivo sem truncar.

Para anexar a um arquivo existente, use print >> .

Exemplo usando um nome de arquivo de log na linha de comando:

... | awk -v out="$log" { print "this is a message" >>out }

ou

... | out=$log awk { print "this is a message" >>ENVIRON["out"] }

O acima seria anexado ao arquivo (possivelmente) preexistente com o nome do caminho na variável log da shell. O segundo exemplo usa a variável de ambiente out como o caminho do arquivo para gravar (isso é definido como $log na linha de comando para awk ).

    
por 26.09.2018 / 11:55

Tags