如何在 UNIX 中打印命令输出的行数 shell
How to print number of lines of command output in UNIX shell
假设 command1 正在处理某些东西,我对 command1 的输出以及输出实际有多少行都感兴趣。
$ command1 | wc - l
打印command1输出的行数,而
$ 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
我隐隐约约觉得用tee
和wc
可以实现,但不知道具体怎么做。
获得所需输出的最简单方法是什么?
我也试过:
command1 | tee >(wc -l)
但这里一定存在竞争条件,因为有时我会收到奇怪的结果。这是测试输出:
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
。
结果相同:
$ (ls -l && printf "Total: ") | tee -a >(wc -l)
使用进程替换:
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
我不知道你所说的 "simplest" 是什么意思,但对我来说最简单的解决方案是:
command1 | awk '1; END { print "\ntotal number of lines:", NR }'
假设 command1 正在处理某些东西,我对 command1 的输出以及输出实际有多少行都感兴趣。
$ command1 | wc - l
打印command1输出的行数,而
$ 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
我隐隐约约觉得用tee
和wc
可以实现,但不知道具体怎么做。
获得所需输出的最简单方法是什么?
我也试过:
command1 | tee >(wc -l)
但这里一定存在竞争条件,因为有时我会收到奇怪的结果。这是测试输出:
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
。
结果相同:
$ (ls -l && printf "Total: ") | tee -a >(wc -l)
使用进程替换:
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
我不知道你所说的 "simplest" 是什么意思,但对我来说最简单的解决方案是:
command1 | awk '1; END { print "\ntotal number of lines:", NR }'