保存此脚本,添加执行权限chmod +x myScript
使用watch -n 5 ./myScript在终端中运行它
#!/usr/bin/bash
list=(192.168.1.{0..12})
my_time=0.7
file=fileName_"$(date)".txt
for ip in "${list[@]}"; do
ping -c 2 "$ip" >ipOutput.txt
if [[ $? -ne 0 ]]; then
cat <ipOutput.txt >>"$file"
echo "error: $ip $(date) [saving to file]"
else
get_time=$(cat <ipOutput.txt | grep avg | awk -F '/' '{print $5}')
if (($(echo "$get_time" '>='"$my_time" | bc -l))); then
cat <ipOutput.txt >>"$file"
echo "$ip OK, MORE time: $get_time milliseconds [saving to file]"
else
echo "$ip : OK, less than $my_time milliseconds [$get_time]"
fi
fi
done
rm ipOutput.txt
解释答案
创建一个 IP 地址数组
list=(192.168.1.{0..12})
您可以将要 ping 的 idaddress 列表保存在文件中,然后将其保存在此变量list 中。这是一个 bash 序列表达式 {0..12} 填充一个范围内的数字,本例是从 0 到 12。最终结果是 list=(192.168.1.0 192.168.1.1 192.168.1.2...)
这可以是字符串[域]的列表,例如:并且工作正常
list=("amazon.com" "google.com" "target.com")
创建变量:
file=fileName_"$(date)".txt
$(date)此命令将日期添加到文件[file_with_errors]
迭代数组list的ip
for ip in "${list[@]}"; do
这行迭代一个名为 list 的数组访问所有带有 [@] 的项目,这是 bash 的特殊语法。
ping每个IP 2次并保存到文件
ping -c 2 "$ip" >ipOutput.txt
-c 参数,ping ip 特定次数,在本例中为 2 次。 ping 之后,将该 OUTPUT 保存到文件 [ipOutput.txt] 而不是带有> 的控制台,这会为每个新 IP 保存 OUTPUT ONCE。
检查 PING 的输出,如果存在错误,将其保存到文件中
if [[ $? -ne 0 ]]; then
cat <file.txt >>"$file"
echo "error: $ip $(date) [saving to file]"
$? 打印最后一个命令[PING] 的最后输出,因为它不等于 0,这意味着错误。 cat< ipOutput.txt 它显示来自 PING 的 OUTPUT 的内容,然后将该数据重定向到变量 $file[your_log_file] 和 >>,这意味着追加 [NO overwrite]。 echo 在终端打印文本格式
如果没有错误则继续 ELSE 语句
else
get_time=$(cat <ipOutput.txt | grep avg | awk -F '/' '{print $5}')
get_time 保存 ping ip 地址的平均时间,以毫秒为单位。
awk awk 是一个用于检查文本列的程序。
-F '/' 参数告诉awk 使用哪个分隔符,在本例中为/。 {print $5} 获取 number 毫秒。
抓取 grep 和 awk
的输出
- rtt min/avg/max/mdev = 1.637/1.693/1.749/0.056 ms
查看 ping ip 地址需要多长时间
if (($(echo "$get_time" '>='"$my_time" | bc -l))); then
我认为(( )) 很奇怪,但为了比较,请这样做。 $(commands) 在这种情况下用于编写命令和管道echo, >=, |。运算符>= 必须有' '。 | bc -l 用于比较 bash 中的浮点数。
这只是一个 IF 语句,但是 bash 需要特殊的 sintax 来比较两个浮点数。
保存到文件,因为需要更多时间来 ping 所需时间
cat <ipOutput.txt >>"$file".txt
echo "$ip OK, but took MORE time: $get_time milliseconds [saving to file]"
else
echo "$ip : OK, less than $my_time milliseconds [$get_time]"
else 一切正常,未保存到文件,但在终端中显示正常状态
删除文件 ipOutput.txt
rm ipOutput.txt
此文件用于保存每个 ip 的输出,使用 ping 命令。此文件会覆盖每个新 ip 的数据,因此您可以使用 grep 和 awk 更轻松地检索信息。