如何使用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

我想做这样的事情: if /64 bytes/ then print 类似的东西:“'my.host.local' is up”

问题是,当我执行 /64 bytes/ 的正则表达式时,我会丢失显示主机名“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 上,-t设置 TTL,并ping等待两倍的秒数。

相关内容