如何在UNIX shell中打印命令输出行数

How to print number of lines of command output in UNIX shell

假设command1正在处理一些东西,我对command1的输出以及实际输出的行数感兴趣。

1
$ command1 | wc - l

打印command1的输出行数,而

1
$ command1 | nl

像这样打印:

1
2
3
4
5
6
 1  ./PaDe014
 2  ./PaDe033
 3  ./PaDe001
 4  ./PaDe013
 5  ./PaDe025
 6  ./PaDe028

看看如何计算文档中的行数?更多解决方案。

但是,我有兴趣生成这样的输出:

1
2
3
4
5
6
7
8
 ./PaDe014
 ./PaDe033
 ./PaDe001
 ./PaDe013
 ./PaDe025
 ./PaDe028

Total number of files generated: 6

我有一种模糊的感觉,它可以用teewc来实现,但我不知道具体是如何实现的。

实现所需输出的最简单方法是什么?

我也尝试过:

1
command1 | tee >(wc -l)

但这里一定有种族条件,因为我不时收到奇怪的结果。以下是测试输出:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
pdebski@PaDe:~$ (ls -l ; printf"Total:") | tee -a >(wc -l)
total 56
drwxr-xr-x 7 pdebski pdebski 4096 cze 22 18:50 Data
drwxr-xr-x 2 pdebski pdebski 4096 cze 22 15:14 Desktop
drwxr-xr-x 2 pdebski pdebski 4096 cze 22 14:50 Documents
drwxr-xr-x 2 pdebski pdebski 4096 cze 16 01:09 Downloads
-rw-r--r-- 1 pdebski pdebski 8980 cze 16 01:04 examples.desktop
drwxr-xr-x 4 pdebski pdebski 4096 cze 17 13:44 Music
drwxr-xr-x 2 pdebski pdebski 4096 cze 22 13:14 Pictures
drwxr-xr-x 2 pdebski pdebski 4096 cze 16 01:09 Public
drwxr-xr-x 2 pdebski pdebski 4096 cze 16 01:09 Templates
drwxrwxr-x 2 pdebski pdebski 4096 cze 22 01:21 test
drwxrwxr-x 2 pdebski pdebski 4096 cze 22 01:21 test2
drwxr-xr-x 2 pdebski pdebski 4096 cze 16 01:09 Videos
Total: pdebski@PaDe:~$ 13

对于Dijkstra的信号量和互斥量的需求,这是一个很好的例子,不是吗?(见https://en.wikipedia.org/wiki/edsger_w._dijkstra)

显然这里应该有一些wait

相同结果:

1
$ (ls -l && printf"Total:") | tee -a >(wc -l)


使用过程替换:

1
command1 | tee >(wc -l)

或者,对于附加生成的文件总数前缀:

1
(command1 && printf"Total number of files generated:") | tee >(wc -l)

参考文献:https://unix.stackexchange.com/questions/28503/how-can-i-send-stdout-to-multiple-commands


我不知道你所说的"最简单"是什么意思,但对我来说,最简单的解决方案是:

1
2
command1 | awk '1; END { print"
total number of lines:", NR }'