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

Posted

技术标签:

【中文标题】如何在 UNIX shell 中打印命令输出的行数【英文标题】:How to print number of lines of command output in UNIX shell 【发布时间】:2017-11-26 01:47:57 【问题描述】:

让我们假设 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

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

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

我也试过了:

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)

【问题讨论】:

【参考方案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

【讨论】:

嗯,可能不是 wait 而是 2>&1 或 3>&1 ?你怎么看? @PawelDebski 不确定什么最适合您,但请查看:***.com/questions/4489139/…【参考方案2】:

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

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

【讨论】:

其实这个可行:ls -l | awk '1; END print "Total number of lines:", NR '。我仍然想知道如何真正同步 tee 输出流...

以上是关于如何在 UNIX shell 中打印命令输出的行数的主要内容,如果未能解决你的问题,请参考以下文章

UNIX命令,统计当前目录(含子目录)下所有后缀为.log的文件中ERROR出现的行数

牛客Shell实战题目1~8

Shell命令和流程控制[linux常用命令的使用]

shell其他

计算终端输出中的行数

shell学习之正则表达式