2017-06-22 103 views
0

假设command1正在处理某些内容,我对command1的输出以及输出实际上有多少行感兴趣。如何在UNIX shell中打印输出命令行数

$ command1 | wc - l 

打印数量的Command行输出,而

$ command1 | nl 

打印类似的东西:

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

更多的解决方案见How to count lines in a document?

不过我很感兴趣,产生这样的输出:

./PaDe014 
./PaDe033 
./PaDe001 
./PaDe013 
./PaDe025 
./PaDe028 

Total number of files generated: 6 

我有一个模糊的感觉,它可以与teewc来实现,但无法弄清楚究竟是如何。

实现预期输出的最简单方法是什么?

我也试过:

command1 | tee >(wc -l) 

但必须有一个竞争条件在这里,从我不时收到奇怪的结果。这里是测试输出:

[email protected]:~$ (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: [email protected]:~$ 13 

Dijkstra的信号量和互斥量需求的一个很好的例子,不是吗? (见https://en.wikipedia.org/wiki/Edsger_W._Dijkstra

显然这里应该有一些wait

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

回答

0

我不知道你所说的 “简单” 的意思,但对我来说,最简单的解决方法是:

command1 | awk '1; END { print "\ntotal number of lines:", NR }' 
+0

其实这一个工程:'ls -l | awk'1; END {print“总行数:”,NR}“。我仍然想知道如何真正同步三通输出流...... –

1

使用进程替换:

具有相同结果

command1 | tee >(wc -l) 

或者,附加文件的总数产生前缀:

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

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

+0

嗯,也许不是'wait'而是2>&1或3>&1?你怎么看? –

+0

@PawelDebski不知道什么最适合你,但看看这个: https://stackoverflow.com/questions/4489139/bash-process-substitution-and-syncing – valiano