我有一个脚本打印出ping服务器的平均时间,如下所示:
ping -c3 "${I}" | tail -1 | awk '{print $4}' | cut -d '/' -f 2 | sed 's/$/\tms/'
如何在ping服务器列表时将行号添加到上面脚本的输出中?
ping 3主机列表时的实际输出是:
6.924 ms
100.099 ms
7.756 ms
我希望输出如下:
1,6.924 ms
2,100.099 ms
3,7,756 ms
这样可以通过excel读取:) 感谢高级!!
答案 0 :(得分:2)
通过perl输出输出:
echo -e 'aa\nbb' | perl -ne 'print $., ",", $_'
输出:
1,aa
2,bb
答案 1 :(得分:2)
这就是你想要的吗?
C=1
for I in 'host1' 'host2' 'host3'
do
ping -c3 "${I}" | tail -1 | awk '{print $4}' | cut -d '/' -f 2 | echo "$C,$(sed 's/$/\tms/')"
C=$((C+1))
done
答案 2 :(得分:0)
行号的标准工具是nl
。将输出管道传输到nl -s,
即:
for I; do
ping -c3 "${I}" | awk -F/ 'END{print $5, "\tms"}'
done | nl -s,
由于您还没有指定列表的生成方式,我只是展示了在命令行中给出要ping的主机列表的情况。请注意,这会在行号之前引入前导空格,因此您可能希望通过sed
对其进行过滤以删除。
当然,这个脚本大部分时间都在等待ping,你可能希望通过并行运行ping来加速它。在这种情况下,最好在开头添加行号,以便在输出中获得稳定的排序:
line=1
{ for I; do ping -c3 $I | awk -F/ 'END{
printf( "%d,%s\tms\n", line,$5 )}' line=$line &
: $((line +=1 ))
done; wait; } | sort -n
在这种情况下,wait
不是必需的,因为sort
将阻塞,直到所有ping都关闭了它们的输出,但如果您在其中添加任何进程,则wait
变为必需sort
之前的管道,在进行任何处理之前不一定等待所有输入,因此最好保留wait
。