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

Lib*_*bux 41 command-line shell bash debian

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

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

编辑:

  • 有没有办法在发生时显示输出(逐行),然后在最后返回一个计数?

phe*_*mer 52

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

program | tee >(wc -l)
Run Code Online (Sandbox Code Playgroud)

>(cmd)是bash的语法该装置运行cmd和替换>(cmd)用的路径(连接到一个命名管道),该程序的STDIN位。

  • `>(cmd)` 是 `ksh` 语法,也被 `zsh` 和 `bash` 识别,并且仅在没有 `/dev/fd/n` 的系统上使用 _named pipe_。 (2认同)

jor*_*anm 13

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

program | awk '{ print } END { print NR }'
Run Code Online (Sandbox Code Playgroud)

在 中awk,NR 是当前行号。你可以用 perl 完成同样的事情:

program | perl -pe 'END {print "$.\n"}'
Run Code Online (Sandbox Code Playgroud)

或者sed

program | sed -n 'p;$='
Run Code Online (Sandbox Code Playgroud)


小智 7

我最喜欢的选择:

program | grep "" -c
Run Code Online (Sandbox Code Playgroud)

  • OP可能问了其他问题,但我来这里只是为了获取输出的行数,并不关心显示实际输出,这可以完成工作。谢谢! (2认同)

小智 5

您可以在 stderr 上克隆 stdout。

program | tee /dev/stderr | wc -l
Run Code Online (Sandbox Code Playgroud)

这样,program的 stdout 将通过管道tee写入 stderr,后者打印在控制台上。tee还将通过管道传输到它的数据写入其标准输出,后者通过管道传输到wc.