ping脚本和日志输出并用grep剪切

时间:2012-08-09 09:36:19

标签: linux bash shell unix

我想ping一堆位置但不能同时ping它们,以便它们不会超时。

输入例如是:ping google.com -n 10 | grep Minimum >> output.txt

这将输出:Minimum = 29ms, Maximum = 46ms, Average = 33ms

但前面有额外的空格,我不知道如何切断,当它输出到txt文件时,它不会转到新行。我要做的是这样做,这样我就可以复制并粘贴输入并在前一个完成后ping一堆地方并将其记录在.txt文件中并对它们进行编号,使其看起来像:

Server 1: Minimum = 29ms, Maximum = 46ms, Average = 33ms
Server 2: Minimum = 29ms, Maximum = 46ms, Average = 33ms
Server 3: Minimum = 29ms, Maximum = 46ms, Average = 33ms
Server 4: Minimum = 29ms, Maximum = 46ms, Average = 33ms

3 个答案:

答案 0 :(得分:2)

首先,Linux上的ping限制了要使用-c而不是-n发送的数据包编号。 其次,ping的输出不是Minimum = xx ms, Maximum = yy ms, Avrage = zz ms,而是rtt min/avg/max/mdev = 5.953/5.970/5.987/0.017 ms

所以基本上如果你做的事情是:

for server in google.com yahoo.com
do
  rtt=`ping $server -c 2 | grep rtt`
  echo "$server: $rtt" >> output.txt
done

你应该达到你想要的目标。

[编辑]

如果cygwin是你的平台,剥离空格的最简单方法就是人们所建议的,sed,或者只是| awk '{print $1}',也会修剪你的线。

答案 1 :(得分:1)

我认为您可以使用sed两次和最后一个while循环解决此问题:

N=1; ping google.com -n 10 | grep Minimum | sed -r 's/(Average = [[:digit:]]+ms)/\1\n/g' | sed -r s'/[[:space:]]+(Minimum)/\1/g' | while read file; do echo Server "$N": "$file"; N=$((N+1)); done >> output.txt

步骤:

  • 第一个sed修复了换行问题:
    • 匹配字符串的最后一部分,在该字符串之后需要一个新行,在本例中为Average = [[:digit:]]+ms并使用括号将其放入一个组中
    • 然后将其替换为相同的组(\1)并在其后插入换行符(\n
  • 第二个sed删除空格,方法是匹配单词Minimum和前面的所有空格,之后只返回单词Minimum
  • 最后while语句循环遍历每一行,并在ping结果前添加Server "$N":$N在开始时初始化为1,并在每个读取行后以1增加

答案 2 :(得分:1)

您可以使用sed删除前4个空格:

ping google.com -n 10 | grep Minimum | sed s/^\ \ \ \ //