O script de shell não pode ativar o arquivo criado

7

Estou tentando criar alguns scripts simples de teste de aprovação / reprovação, mas estou tendo alguns desafios, conforme descrito abaixo. Minha intenção é obter os resultados completos de um comando (como ping) em um arquivo results.txt para manter, mas também analisar o arquivo results.txt para verificações diferentes a serem levantadas se problemas forem detectados:

#!/bin/bash
ping -c 20 google.com > results.txt
packetloss = 'awk '/packet loss/{x=$6} END{print x}' results.txt'
echo "$packetloss" >> debug.txt
#  if packetloss > 0, add to an error.txt to fail
#  if avg ping time > 5ms, add to an error.txt to fail

A variável packetloss não está obtendo as informações de awk do arquivo results.txt (enviando para um arquivo de depuração rever). Eu queria saber se há algo sobre scripts de shell que evitaria isso e uma solução alternativa associada?

Executar manualmente awk on results.txt retorna '0%', que é o resultado esperado.

    
por dhartford 30.12.2014 / 22:47

2 respostas

11

Espaços não são permitidos em torno de = !

Então:

#!/bin/bash
ping -c 20 google.com > results.txt
packetloss=$(awk '/packet loss/{print $6}' results.txt)
echo "$packetloss" >> debug.txt

Ou ainda mais curto:

ping -c 20 google.com |
    awk '/packet loss/{sub(/%/, "");print $6 >> "debug.txt"}'

NOTA:

  • Não é necessário atribuir a variável x ; você pode imprimir $6 diretamente.
  • O próprio AWK pode criar novos arquivos com sua saída
  • O backquote
    '
    é usado na substituição de comandos do estilo antigo, por exemplo:
foo='command'

A sintaxe foo=$(command) é recomendada em seu lugar. A manipulação de barra invertida dentro de $() é menos surpreendente, e $() é mais fácil de aninhar.

Verifique o link

Solução extra usando Perl :

ping -c 20 google.com |
    perl -lne '/(\d+)%\s+packet\s+loss/ and print $1' >> debug.txt
    
por 30.12.2014 / 22:49
1
#!/usr/bin/perl
my $host=shift or die("Usage $0 host\n");

open(PING , "-|", "ping -c 20 $host") or die;
open(DEBUG, ">>", "debug.txt"       ) or die; 

while(<PING>){
  if(m!(\d+)% packet loss!     ){ $Lost=$1 }
  if(m!rtt.*= (.+?)/(.+?)/(.+)!){ $Avg=$2  }
}

if   ( $Lost > 0 ) { print DEBUG "not ok: lost pcks ($Lost%)\n"    }
elsif( $Avg  > 5 ) { print DEBUG "not ok: too slow  ($Avg)\n"      }
else               { print DEBUG "ok: ping\n"                      }
    
por 31.12.2014 / 00:12

Tags