【问题标题】:Bash Script to log average ping times, every 20 seconds for a day用于记录平均 ping 时间的 Bash 脚本,每天每 20 秒
【发布时间】:2014-02-08 23:48:27
【问题描述】:

我目前正在尝试编写一个 bash 脚本来记录 atm 的平均 ping 时间。三个不同的目标,每 20 秒一整天。 这是我目前拥有的..

#!/bin/bash

echo "SCRIPT STARTED" >> pingthing.log
date +%d.%m.%y' '%R:%S >> pingthing.log

for i in $(seq 1 4320);
do
    date +%d.%m.%y' '%R:%S >> pingthing.log
    #save just target IP and avg time.
    ping -c 3 -q -W 2 8.8.8.8 >> pingthing.log
    ping -c 3 -q -W 2 64.25.40.16 >> pingthing.log
    ping -c 3 -q -W 2 96.17.199.48 >> pingthing.log
    sleep 20
done

echo "SCRIPT ENDED" >> pingthing.log
date +%d.%m.%y' '%R:%S >> pingthing.log

现在我的问题...

  • 如何 sed/awk ping 摘要以仅保存目标和平均时间?
  • 我该如何处理 100% 损失的情况?

编辑:抱歉,我没有使用 sed/awk 的经验,但知道可以使用这些工具来完成。让我试着澄清一下自己

这是当前保存在我的日志文件中的内容.. 但这仅显示了它的开头

SCRIPT STARTED
07.02.14 22:14:13
07.02.14 22:14:13
PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.

--- 8.8.8.8 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2000ms
rtt min/avg/max/mdev = 127.773/152.321/192.204/28.452 ms
PING 64.25.40.16 (64.25.40.16) 56(84) bytes of data.

--- 64.25.40.16 ping statistics ---
3 packets transmitted, 3 received, +2 duplicates, 0% packet loss, time 2003ms
rtt min/avg/max/mdev = 213.889/237.182/286.825/26.656 ms
PING 96.17.199.48 (96.17.199.48) 56(84) bytes of data.

--- 96.17.199.48 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1001ms
rtt min/avg/max/mdev = 305.028/340.081/375.135/35.058 ms

现在我只想拥有目标及其平均值。 ping 命令的时间如

SCRIPT STARTED
07.02.14 22:14:13
07.02.14 22:14:13
8.8.8.8 152.321
64.25.40.16 237.182
96.17.199.48 340.081

我知道我应该将 ping 命令通过管道传递给 sed/awk,但由于我没有这方面的经验,所以我暂时将其省略了。

我不想让你解决所有问题,我是来讨论和学习的。 对于 100% 损失问题.. 输出看起来像这样

ping -W 2 -q -c 3 1.1.1.1

PING 1.1.1.1 (1.1.1.1) 56(84) bytes of data.

--- 1.1.1.1 ping statistics ---
3 packets transmitted, 0 received, 100% packet loss, time 2016ms

现在这里没有成功 ping 的总结行,所以我不能对那个模式使用 sed/awk..

【问题讨论】:

  • 您尝试过什么?它是如何失败的?你从 awk 中学到了什么?我们不是一个“免费解决我所有问题”的社区。​​span>
  • 如果您想要一个 sed 或 awk 脚本,您至少需要为该脚本提供一些示例输入和预期输出。例如,如果您希望它解析 ping -c 3 -q -W 2 <IP> 的输出,那么您需要发布一些 ping -c 3 -q -W 2 <IP> 的示例输出,因为这将是您的 sed 或 awk 脚本的示例输入,然后您需要发布您想要的输出就像您的 sed 或 awk 脚本从该示例输入中生成一样。
  • 您无需在 SO 上签署您的问题,我们已经可以看到您的用户名。
  • 不要将每个输出行重定向到 pingthing.log ——而是在您调用它时重定向整个脚本输出。然后你可以通过 sed 或 awk 管道 ping 命令:ping -c 3 -q -W 2 8.8.8.8 | sed -e '<something>'

标签: linux bash sed awk ping


【解决方案1】:

鉴于您发布的示例输入文件:

$ awk -F'[ /]' 'NR~/^[123]$/; /^---/{ip=$2} /^rtt/{print ip, $8}' file
SCRIPT STARTED
07.02.14 22:14:13
07.02.14 22:14:13
8.8.8.8 152.321
64.25.40.16 237.182
96.17.199.48 340.081

你没有告诉我们你想要“100% 损失问题”的输出,所以我不知道你想用它做什么。只需将其包含在您的示例输入和预期输出中,除非目前尚不清楚某些具体原因。

如果您只想打印说明 100% 丢失的内容,您可以将脚本调整为:

awk -F'[ /]' 'NR~/^[123]$/; /^---/{ip=$2} /^rtt/{print ip, $8} /100% packet loss/{print ip, "100% packet loss"}' file

可能性是无穷无尽的......只需告诉我们您需要输出什么。

这里用 cmets 一次一行:

awk -F'[ /]' '       # use space and / as the field separator
NR~/^[123]$/;        # if youre on input line 1, 2, or 3, print that line (the default action)
/^---/{ip=$2}        # if the line starts with 3 dashes, save the 2nd field as the IP address
/^rtt/{print ip, $8} # if the line starts with rtt, print the saved IP address and the 8th field which is the averages
/100% packet loss/{print ip, 2000} # if the line contains the 100%... statement, print the IP address and a default value of 2000
' file

【讨论】:

  • 非常感谢,会尝试一步一步了解awk命令的作用..!对于 100% 损失的情况,我没有解决方案,现在我只是在这些情况下节省了 2000 毫秒的平均时间。
  • 我添加了一个版本,其中每个条件+动作与 cmets 位于单独的一行,因此更容易理解。我还将 100% 损失案例的打印更改为打印 2000。
  • 完美,非常感谢您的广泛回答!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-15
  • 1970-01-01
相关资源
最近更新 更多