ping 192.168.0.1 | awk '{print $ 1}' [duplicado]

3
ping 192.168.0.1 | awk '{print $1}'
connect: Network is unreachable

Estou criando um script que faz alguma tarefa. Então, eu queria mostrar a mensagem de erro apropriada sobre o nome do host inválido ou erros gerados pelo comando ping.

Pensei em modificar erros gerados usando o comando acima mencionado. O que eu queria fazer era imprimir apenas o erro e não 'ping', mas isso não acontece. Alguém pode me dizer o remédio para isso.

    
por user313431 30.09.2018 / 05:13

3 respostas

0

Pode ser útil definir e capturar tudo o que você deseja trabalhar como variável:

  1. $CMD_PING - O comando que você deseja avaliar (como uma variável, é mais fácil executá-lo e capturar os resultados conforme desejado)
  2. $CODE_EXIT - O código de saída retornado quando $CMD_PING é avaliado (será algo diferente de 0 se um erro ocorreu)

Exemplo:

#!/bin/bash
CMD_PING="ping -c1 does-not-exist"
EXEC_PING="$( $CMD_PING >/dev/null 2>&1 )" # STDOUT and STDERR go to /dev/null
CODE_EXIT="$?"
if [ ! 0 -eq "$CODE_EXIT" ]; then
        # echo error only (or capture error for parsing)
        # capture example: EXEC_PING="$( $CMD_PING >/dev/null )"
        $CMD_PING >/dev/null # STDOUT goes to /dev/null, only STDERR prints
        exit 1
fi
echo "success"
    
por 30.09.2018 / 06:42
0

Se você estiver usando ping apenas para determinar se o nome do host fornecido está acessível ou não, você pode fazer isso:

if ping -c 1 "$otherhost" >/dev/null 2>&1; then
    printf 'The host "%s" is reachable\n' "$otherhost"
else
    printf 'The host "%s" is not reachable\n' "$otherhost"
fi

Isso envia um único pacote ECHO_REQUEST para o host fornecido em "$otherhost" e usa o status de saída de ping para determinar se o utilitário conseguiu executar sua tarefa ou não. Toda saída comum de ping é descartada.

Observe que, se ping não conseguir consultar outro host, isso não significa que o host esteja definitivamente desativado ou não seja roteável. Pode simplesmente estar ignorando o pacote ECHO_REQUEST .

Se você deseja produzir o erro real produzido por ping na falha, você pode fazer isso da seguinte maneira para evitar ter que chamar o utilitário duas vezes (como os erros de rede às vezes são transitórios, uma segunda invocação de ping pode não estar falhando ou pode estar falhando de uma maneira diferente):

pingerr=$(mktemp)
if ping -c 1 "$otherhost" >/dev/null 2>"$pingerr"; then
    printf 'The host "%s" is reachable\n' "$otherhost"
else
    printf 'The host "%s" is not reachable\n' "$otherhost"
    if [ -s "$pingerr" ]; then
        echo 'ping error:'
        cat "$pingerr"
    fi
fi
rm -f "$pingerr"

Isso salva qualquer mensagem de diagnóstico de ping em um arquivo temporário que será posteriormente gerado se ping falhar (se houver algo nele, que é o teste de -s ). O arquivo sempre será criado (mesmo que permaneça vazio), por isso, o removemos depois da if -statement.

Usando esse método, você também pode analisar o arquivo de saída de erro da maneira que desejar. Por exemplo:

pingerr=$(mktemp)
if ping -c 1 "$otherhost" >/dev/null 2>"$pingerr"; then
    printf 'The host "%s" is reachable\n' "$otherhost"
else
    printf 'The host "%s" is not reachable\n' "$otherhost"
    if [ -s "$pingerr" ]; then
        printf 'ping says'
        sed 's/^[^:]*//' <"$pingerr"
    fi
fi
rm -f "$pingerr"

Aqui, em vez de apenas enviar a mensagem original de ping , removemos o bit antes do primeiro : antes de imprimi-lo.

    
por 30.09.2018 / 08:43
0

A única maneira em que sua ideia poderia funcionar é se a saída de erro (stderr) é trocada com stdout para enviar os valores de erro para awk (usando um endereço inexistente):

$ ping -c4 invalid.local. 3>&2 2>&1 1>&3 | awk '{print "Error ==> " $0}'
Error ==> ping: unknown host

Mas o status de saída se tornará a saída do awk, que geralmente deve ser sucesso (0).

Se tudo que você quer é receber o erro e agir sobre o status de saída do ping, você pode usar:

$ ping -c4 invalid.local. 2>&1 1>&- ; echo $?
ping: unknown host
1

$ ping -c4 127.0.0.1 2>&1 1>&- ; echo $?
0

Então, o teste poderia ser:

if ping -c3 -w5 domain.com 2>&1 1>&- ; then 
    echo "ping was successful"
else
    echo "ping failed with code $?"
fi
    
por 30.09.2018 / 12:10