Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在shell脚本中打印输出的行号_Shell_Pipeline - Fatal编程技术网

在shell脚本中打印输出的行号

在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服务器时的平均时间,如下所示:

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的/^/$,/'