在shell脚本中打印输出的行号
我有一个脚本,可以打印ping服务器时的平均时间,如下所示:在shell脚本中打印输出的行号,shell,pipeline,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读取:)
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读取:)
提前感谢 通过perl传输输出:
echo -e 'aa\nbb' | perl -ne 'print $., ",", $_'
输出:
1,aa
2,bb
通过perl传递输出:
echo -e 'aa\nbb' | perl -ne 'print $., ",", $_'
输出:
1,aa
2,bb
这就是你想要的吗
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
这就是你想要的吗
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
行号的标准工具是
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
在这种情况下,
等待
是不必要的,因为排序
将阻塞,直到所有ping关闭其输出,但是如果在排序
之前添加管道中的任何进程,而这些进程不必在执行任何处理之前等待所有输入,等待
将成为必要的,因此,最好将等待
保持在原位。行编号的标准工具是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
在这种情况下,
等待
是不必要的,因为排序
将阻塞,直到所有ping关闭其输出,但是如果在排序
之前添加管道中的任何进程,而这些进程不必在执行任何处理之前等待所有输入,等待
将成为必要的,因此,最好将等待
保持在原位。这些命令在循环中吗?确切地说:)在for循环中:)我对您的输出感到困惑。示例中的sed
看起来像是在“ms”前面加了一个标签。你想要一个制表符还是一个空格?我只想要一个空格:)但实际上制表符也很好:)那些命令在循环中吗?确切地说:)在for循环中:)我被你的输出搞糊涂了。示例中的sed
看起来像是在“ms”前面加了一个标签。你想要一个标签还是一个空格?我只想要一个空格:)但实际上标签也很好:)+1或awk:|awk'{print NR',“$0}”
。您还可以编写perl-pe的/^/$,/'
OP通过一个命令进行循环,并且它的输出对于每个迭代只有一行。因此,我认为这种方法不适用于本案。@jkshah在评论澄清前回答。他仍然可以通过perl来传递整个脚本输出,但他同意在这种情况下这不是最优的;做完成| perl-pe的/^/$,/'+1或awk:| awk'{print NR',“$0}'
。您还可以编写perl-pe的/^/$,/'
OP通过一个命令进行循环,并且它的输出对于每个迭代只有一行。因此,我认为这种方法不适用于本案。@jkshah在评论澄清前回答。他仍然可以通过perl来传递整个脚本输出,但他同意在这种情况下这不是最优的;做完成| perl-pe的/^/$,/'