首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >shell脚本中输出的打印行数

shell脚本中输出的打印行数
EN

Stack Overflow用户
提问于 2013-11-18 16:42:46
回答 3查看 2.6K关注 0票数 2

我有一个脚本,它打印出单击服务器的平均时间,如下所示:

代码语言:javascript
复制
ping -c3 "${I}" | tail -1 | awk '{print $4}' | cut -d '/' -f 2 | sed 's/$/\tms/'

当我点击服务器列表时,如何将行号添加到上面脚本的输出中?

当3台主机点击列表时,我的实际输出是:

代码语言:javascript
复制
6.924 ms
100.099 ms
7.756 ms

我希望输出是这样的:

代码语言:javascript
复制
1,6.924 ms
2,100.099 ms
3,7,756 ms

这样,excel就可以读到这个了:)谢谢!

EN

回答 3

Stack Overflow用户

发布于 2013-11-18 16:54:01

通过perl传输输出:

代码语言:javascript
复制
echo -e 'aa\nbb' | perl -ne 'print $., ",", $_'

输出:

代码语言:javascript
复制
1,aa
2,bb
票数 2
EN

Stack Overflow用户

发布于 2013-11-18 16:55:17

这是你想要的吗?

代码语言:javascript
复制
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
EN

Stack Overflow用户

发布于 2013-11-19 02:59:28

行编号的标准工具是nl。将输出输送到nl -s,,即:

代码语言:javascript
复制
for I; do
  ping -c3 "${I}" | awk -F/ 'END{print $5, "\tms"}' 
done | nl -s,

由于您还没有指定列表是如何生成的,所以我只是在命令行中显示要单击的主机列表的情况。请注意,这在行号之前引入了前导空格,因此您可能希望通过sed筛选删除。

当然,这个脚本大部分时间都在等待ping,您可能希望通过并行运行ping来加快它的速度。在这种情况下,最好在开头添加行号,以便在输出中获得稳定的排序:

代码语言:javascript
复制
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关闭它们的输出,但是如果您在sort之前添加了管道中的任何进程,而这些进程在执行任何处理之前不一定要等待它们的所有输入,那么wait就变得必要了,所以保持wait的位置是一个很好的做法。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20053050

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档