AWKを使用して別の行に異なるフィールドを印刷する方法

AWKを使用して別の行に異なるフィールドを印刷する方法
Here is my sample :
PING my.host.local (10.10.10.10): 56 data bytes
64 bytes from 10.10.10.10: icmp_seq=0 ttl=63 time=2.034 ms

--- my.host.local ping statistics ---
1 packets transmitted, 1 packets received, 0.0% packet loss
round-trip min/avg/max/stddev = 2.034/2.034/2.034/0.000 ms

私は次のことをしたいと思います:/ 64 bytes /なら、次のように印刷します: "'my.host.local' is up"

問題は、/ 64バイト/の正規表現を実行すると、ホスト名「my.host.local」を示す行が失われ、そのフィールドを使用して最終メッセージを印刷できないことです。

あなたは何をしますか?

乾杯、

答え1

変数を使用してホスト名を保存します。

awk '/^PING/ { host = $2 } /^64 bytes/ { print host " is up" }'

ホストがダウンしたときに何かをするには、応答が見えるかどうかに注意を払い、最後に両方のケースを処理する必要があります。

awk '/^PING/ { host = $2 }
     /^64 bytes/ { up = 1 }
     END {
       if (up) { print host " is up" }
       else { print host " is down" }
     }'

答え2

次のようなことができます

ping -c 1 $machine | awk '
  $1 == "PING" {host = $2}
  $2 == "bytes" {
    if ($1 == 64)
      print host " is up"
    else
      print host " did not ping 64 bytes"
  }
'

答え3

おそらくホストを既に知っている(ホストを実行しているのでping)、64 bytes次の終了ステータスを使用できるため、テキストを検出する必要はありませんping

myhost=my.host.local

if ping -c 1 -t 5 "$myhost" >/dev/null 2>&1
then
    printf 'host %s is up\n' "$myhost"
else
    printf 'host %s does not appear to be reachable\n' "$myhost"
fi

これはタイムアウトで指定されたホストへのpingを試みます。ユーティリティの終了状態だけが意味があるため、すべての出力を削除します。これは、ifどのブランチを選択するかを決定するために使用されます。

FreeBSDは-tタイムアウトを秒単位で設定します。 Linuxでは-tTTLを設定し、ping2倍の秒数を待ちます。

関連情報