计算上一个程序的输出行数

计算上一个程序的输出行数

我正在尝试计算某个程序产生的输出行数。问题是,该程序需要很长时间才能运行,而我想向用户显示输出。有没有办法计算最后一个命令输出的行数?

我可以这样做program | wc -l,但这不会向用户显示输出。据我所知,我必须这样做program; program | wc -l- 但程序至少需要一分钟才能运行,所以我不想为了在底部显示行数而多次执行此操作。

编辑:

  • 有没有一种方法可以显示输出(逐行),然后在最后返回计数?

答案1

您可以像平常一样tee分割输出流,将一个副本发送到 STDOUT,wc将另一个副本发送到 STDOUT。

program | tee >(wc -l)

bash语法>(cmd)意味着运行并用该程序的 STDIN(连接到的命名管道)的路径cmd替换该位。>(cmd)

答案2

一种选择是使用 awk,它可以进行计数并打印到标准输出。

program | awk '{ print } END { print NR }'

其中awk,NR 是当前行号。您可以使用 perl 完成相同的任务:

program | perl -pe 'END {print "$.\n"}'

或者sed

program | sed -n 'p;$='

答案3

我最喜欢的选择:

program | grep "" -c

答案4

这可能会迟到。但我只想解决您关于如何捕获变量中的计数的后续问题。

这就是你想要的YOUR_VAR=$(PROGRAM | tee /dev/stderr | wc -l)

我们利用tee此处生成两个流并将一个定向到/dev/stderr,这将出现在您的屏幕上,另一个定向到wc -l,它将报告行数。

相关内容