我想ping游戏上的一些服务器,它们都是相同的格式,只有可能有数百个。这就是我目前使用的:
ping server1.servername.com -n 20 | grep Minimum | awk '{print $3}' | sed s/,// >> Output.txt
这会对服务器执行20次ping操作,并切断除最小ping数量之外的所有内容。如果我想ping 300这些服务器,我必须将相同的行粘贴300次...是否可以让它在一行中指定1-300这样的东西而不需要300行相同的东西?
答案 0 :(得分:2)
你可以使用循环:
while read line
do
ping $line.servername.com -n 20 | grep Minimum | awk '{print $3}' | sed s/,// >> Output.txt
done < servers_list
答案 1 :(得分:2)
rojo@aspire:~$ help for
<snip...>
for ((: for (( exp1; exp2; exp3 )); do COMMANDS; done
Arithmetic for loop.
Equivalent to
(( EXP1 ))
while (( EXP2 )); do
COMMANDS
(( EXP3 ))
done
EXP1, EXP2, and EXP3 are arithmetic expressions. If any expression is
omitted, it behaves as if it evaluates to 1.
尝试这样的事情:
for (( x=1; $x<=300; x++ )); do ( ping server$x.servername.com -n 20 | grep Minimum | awk '{print $3}' | sed s/,// >> Output.txt ); done
<强>更新强>
以下是我在下面对这个答案的评论中提到的一个黑客的想法。警告:我认为我的ping命令必须与你的不同。我正在Debian机器上创作这个想法。
而不是-n count
我的ping
语法是-c count
,而不是包含“最小”的行,而是“min / avg / max / mdev”。因此,您可能需要使用grep
语法等等。无论如何,考虑到这一点,根据需要修改以下内容,按顺序从1执行ping每个服务器直到错误。
#!/bin/bash
i=0
while [ $? -eq 0 ] && i=$(( i + 1 )); do (
echo -n "server$i min: "
ping server$i.servername.com -c 20 -i 0.2 | grep -P -o -e '(?<=\= )\d\.\d+'
); done
echo "n/a"
基本上用简单的英语,这意味着当退出代码= 0并且增加i时,回显服务器名称而没有换行符并以200ms的间隔对其进行20次ping操作,完成回显的行(从ping结果中抓取)一个小数数字前面有一个等空格。 (该模式匹配Linux iputils ping
摘要中的最小ping时间结果。)如果ping失败,退出代码将不等于0并且循环将中断。
答案 2 :(得分:2)
听起来像是xargs的工作,例如,
$ cat server-list | xargs -I% ping % -n 20 ...