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을 설정하고 ping두 배의 시간(초)을 기다립니다.

관련 정보