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
等待两倍的秒数。