在shell脚本中打印输出行数

时间:2013-11-18 16:42:46

标签: shell pipeline

我有一个脚本打印出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读取:) 感谢高级!!

3 个答案:

答案 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